2013-06-01 15 views
0

我試圖通過一個控制器在我的佈局中使用的局部視圖,像這樣:asp.net的MVC - 嘗試有部分觀點在我的佈局和獲得:

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

而且,從我在佈局中增加了行,我得到這個錯誤:

Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.

請幫助。

+1

'mvc'模式的想法是分離編碼和標記。所以在模型中使用html是不好的做法。我沒有用'asp.net mvc'做很多事情,但通常這是違反mvc模式的,IMO。 – Leri

+0

你的'Menu'控制器的'Index.cshtml'在哪裏? –

+0

你是對的,我只是爲了在我把所有東西都放到位之前第一次看到這個作品。 – Zephram

回答

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> 

你應該能夠遵循這種模式,並調整上面的代碼,以滿足您的需求;如果沒有,問,我會看看我能否想出一個簡單/天真的例子。

相關問題