より良いオプションは、_Layout.cshtml を使用することです。_ViewStart は _Layout.cshtml を呼び出すだけです。
ここではおそらく部分ビューは必要ありません。PartialView の結果をレンダリングする子アクションを使用できます。
あなたの
_Layout.cshtml :
あなたが持つことができます
@{ Html.RenderAction("Navigation", "Home"); }
これは HomeController と Navigation アクションを指します
追記: Html.RenderAction は Html.Action よりもはるかに高速であるため、優れています。結果を Response に直接送信するため、大量の 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; }
}