2013-10-11 43 views
-1

即時通訊使用MVC4構建網站,我想根據我的數據庫在我的_ViewStart頂部顯示導航欄。mvc4部分視圖解決方案需要

我該怎麼做?我可以使用一個索引頁面加載後觸發的控制器ActionResult嗎? 或如何可以通過一個局部視圖通過靶向它

我的當前的ActionResult返回局部視圖是:

public ActionResult NavigationBar() 
    { 
     var entities = new CakesDBEntities(); 

     var articles = entities.Articles; 

     List<NavBarModel> navBarList = articles.Select(nb => new NavBarModel { Title = nb.title, Url = nb.url }).ToList(); 
     return View(navBarList); 
    } 

我的模型:

namespace SimplyCakes20131009.Models 
{ 
    public class NavBarModel 
    { 
     public string Title { get; set; } 
     public string Url { get; set; } 
    } 

}

我的局部視圖:

@model IEnumerable<SimplyCakes20131009.Models.NavBarModel> 


@foreach (var bar in Model) 
{ 
    <li> 
     @Html.ActionLink(bar.Title, bar.Url) 
    </li> 
} 

如何將導航欄集成到我的_ViewStart?

回答

2

更好的選擇是使用_Layout.cshtml。 _ViewStart只是調用_Layout.cshtml。

你可能不需要部分在這裏查看。您可以使用呈現PartialView結果的子操作。

在你

_Layout.cshtml:

你可以有

@{ Html.RenderAction("Navigation", "Home"); } 

這點HomeController的和導航操作

附加說明:Html.RenderAction更好,因爲它比Html.Action快得多。 它可以高效地處理大量的HTML,因爲它會直接將結果發送給響應。 Html.Action只是返回一個結果字符串。

導航操作的導航視圖與您在視圖中的功能非常相似。

主頁/ Navigation.cshtml:

@model IEnumerable<MvcApplication1.Controllers.NavViewModel> 

    @foreach (var nav in Model) 
    { 
    <li>@Html.ActionLink(nav.Title, nav.Url)</li> 
    } 

HomeController.cs:

請注意,你可能注入DB訪問的依賴,支持可測試性。

public class HomeController : Controller 
{ 
    private readonly ICakesRepository _cakesRepository; 

    //additional constructor to support testability. 
    public HomeController(ICakesRepository cakesRepository) { 
     _cakesRepository = cakesRepository; 
    } 

    //this can be removed if you the above with IOC/DI wire-up 
    public HomeController() { 
     _cakesRepository = new CakesRepository(); 
    } 

    [ChildActionOnly] 
    [HttpGet] 
    public ActionResult Navigation() { 
     var articles = _cakesRepository.GetArticles(); 
     var navBarList = articles.Select(nb => new NavViewModel { Title = nb.Title, Url = nb.Url }); 
     return PartialView(navBarList); 
    } 
} 

其他支持類:

public class NavViewModel { 
    public string Title { get; set; } 
    public string Url { get; set; } 
} 

public interface ICakesRepository { 
    IEnumerable<Articles> GetArticles(); 
} 

public class CakesRepository : ICakesRepository { 
    public IEnumerable<Articles> GetArticles() { 
     //call to a db 
     //fake db data 
     return new List<Articles>()    { 
      new Articles(){Title = "Title1", Url = "http://urlone.com"}, 
      new Articles(){Title = "Title2", Url = "http://urltwo.com"}, 
      new Articles(){Title = "Title3", Url = "http://urlthree.com"} 
     }; 
    } 
} 

public class Articles { 
    public string Title { get; set; } 
    public string Url { get; set; } 
} 
+0

坦克拉吉幫助了我很多! – user1718033

+0

非常感謝您的時間和精力! – user1718033