-1

MVC4 を使用してサイトを構築しています。データベースに従って、_ViewStart の上部にナビゲーション バーを表示したいと考えています。

どうすればそうできますか?インデックス ページが読み込まれると起動するコントローラー 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 に統合するにはどうすればよいですか?

4

1 に答える 1

2

より良いオプションは、_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; }
}
于 2013-10-11T23:08:44.607 に答える