Asp.net mvc asp.net mvc-尝试在我的布局中使用局部视图并获得:
我试图通过布局中的控制器使用局部视图,如下所示:Asp.net mvc asp.net mvc-尝试在我的布局中使用局部视图并获得:,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我试图通过布局中的控制器使用局部视图,如下所示: \u Layout.cshtml: <ul id="menu"> <li>@Html.Action("Menu")</li> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li>
\u Layout.cshtml
:
<ul id="menu">
<li>@Html.Action("Menu")</li>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
public class MenuController : Controller
{
//
// GET: /Menu/
public ActionResult Index()
{
var menu = new Models.Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
}
};
return View();
}
}
public class Menu : MenuItem
{
public List<MenuItem> Items { get; set; }
public override string Render()
{
StringBuilder sb = new StringBuilder("<div>");
foreach (var item in Items)
{
sb.Append(item.Render());
}
sb.Append("</div>");
return sb.ToString();
}
public Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
};
}
}
public abstract class MenuItem
{
public string CssClass { get; set; }
public abstract string Render();
}
型号:
<ul id="menu">
<li>@Html.Action("Menu")</li>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
public class MenuController : Controller
{
//
// GET: /Menu/
public ActionResult Index()
{
var menu = new Models.Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
}
};
return View();
}
}
public class Menu : MenuItem
{
public List<MenuItem> Items { get; set; }
public override string Render()
{
StringBuilder sb = new StringBuilder("<div>");
foreach (var item in Items)
{
sb.Append(item.Render());
}
sb.Append("</div>");
return sb.ToString();
}
public Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
};
}
}
public abstract class MenuItem
{
public string CssClass { get; set; }
public abstract string Render();
}
菜单.cs
:
<ul id="menu">
<li>@Html.Action("Menu")</li>
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
public class MenuController : Controller
{
//
// GET: /Menu/
public ActionResult Index()
{
var menu = new Models.Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
}
};
return View();
}
}
public class Menu : MenuItem
{
public List<MenuItem> Items { get; set; }
public override string Render()
{
StringBuilder sb = new StringBuilder("<div>");
foreach (var item in Items)
{
sb.Append(item.Render());
}
sb.Append("</div>");
return sb.ToString();
}
public Menu()
{
Items = new List<Models.MenuItem>()
{
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="a"},
new Models.BaseMenuBtn() { Label = "One", Link= "Home", CssClass="b"}
};
}
}
public abstract class MenuItem
{
public string CssClass { get; set; }
public abstract string Render();
}
BaseMenuBtn.cs
public class BaseMenuBtn : MenuItem
{
public string Label { get; set; }
public string Link { get; set; }
public override string Render()
{
return string.Format("<div href='{0}' class='{1}'> {2} </div>", this.Link , this.CssClass, this.Label);
}
}
public类BaseMenuBtn:MenuItem
{
公共字符串标签{get;set;}
公共字符串链接{get;set;}
公共重写字符串Render()
{
返回string.Format(“{2}”、this.Link、this.CssClass、this.Label);
}
}
从我在布局中添加的行中,我得到以下错误:
执行处理程序的子请求时出错
'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'
请提供帮助。如果您试图从模型生成HTML,您确实应该创建
HtmlHelper
类的扩展。例如,我为站点导航扩展创建了以下内容:
public static HtmlString MenuLink(this HtmlHelper helper, string text, string actionName, string controllerName, object routeValues)
{
string currentAction = helper.ViewContext.RouteData.GetRequiredString("action");
string currentController = helper.ViewContext.RouteData.GetRequiredString("controller");
var li = new TagBuilder("li");
if (actionName.ToLower() == currentAction.ToLower() && controllerName.ToLower() == currentController.ToLower())
{
li.AddCssClass("selected");
}
li.InnerHtml = helper.ActionLink(linkText: text, actionName: actionName, controllerName: controllerName, routeValues: routeValues, htmlAttributes: null).ToHtmlString();
return MvcHtmlString.Create(li.ToString());
}
一旦我在web.config
文件中注册了扩展名的名称空间,我就可以这样调用这个助手:
@Html.MenuLink("Contact", "contact", "home", new { })
这就为我产生了:
<li class="selected">
<a href="/contact">Contact</a>
</li>
您应该能够遵循这种模式,并调整上述代码以满足您的需要;如果没有,问一下,我会看看是否能想出一个简单/简单的例子。mvc模式的思想是将编码和标记分开。因此,在模型中使用html是不好的做法。我对
asp.net mvc
做得不多,但在我看来,这通常打破了mvc模式。您的菜单
控制器的索引.cshtml
在哪里?您是对的,我这么做只是为了第一次看到这项工作,然后才把一切都安排好。