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
    在哪里?您是对的,我这么做只是为了第一次看到这项工作,然后才把一切都安排好。