需要mvc4 PartialView解决方案

时间:2013-10-11 09:42:12

标签: asp.net-mvc-4 partial-views

使用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?

1 个答案:

答案 0 :(得分:2)

更好的选择是使用_Layout.cshtml。 _ViewStart只是调用_Layout.cshtml。

您可能不需要部分查看此处。您可以使用呈现PartialView结果的子操作。

在你的

_Layout.cshtml:

你可以拥有

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

这指向HomeController和导航操作

附加说明:Html.RenderAction更好,因为它比Html.Action快得多。 它可以有效地处理大量HTML,因为它会直接将结果发送到Response。 Html.Action只返回带有结果的字符串。

导航操作的导航视图与您在视图中的视图非常相似。

主页/ Navigation.cshtml:

  @model IEnumerable<MvcApplication1.Controllers.NavViewModel>

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

HomeController.cs:

请注意,您可能会将数据库访问作为依赖项注入,以支持可测试性。

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