使用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?
答案 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; }
}