0

我试图通过我的布局中的控制器使用部分视图,如下所示:

_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>

MenuController.cs

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();
    }
}

型号

Menu.cs

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"}
            };


   }
}

MenuItem.cs

    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);
    }
}

而且,从我在布局中添加的行中,我收到了这个错误:

执行处理程序“System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper”的子请求时出错。

请帮忙。

4

1 回答 1

0

如果您尝试从模型生成 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>

您应该能够遵循此模式并调整上面的代码以满足您的需求;如果没有,请询​​问,我会看看我是否能想出一个简单/天真的例子。

于 2013-06-01T08:34:15.850 回答