这是编写为在控制器中编写的代码:
CategoryRepository categoryRepo = new CategoryRepository();
var categories = categoryRepo.FindAllCategories();
ViewBag.Categories = categories;
现在我想用它来动态创建一个很好的类别列表。
<div id="leftnavigationbar">
<ul>
@foreach (var category in ViewBag.Categories)
{
//Create li here.
}
<!-- ActionLink goes: Text, ActionName, Controller -->
<li>@Html.ActionLink("Libros", "Index", "Home")</li>
<li>@Html.ActionLink("Peliculas, Musica & Juegos", "Index", "Anuncios")</li>
<li>@Html.ActionLink("Computadoras", "Index", "Usuarios")</li>
<li>@Html.ActionLink("Bienes Raices", "Index", "Ayuda")</li>
<li>@Html.ActionLink("Bolsa de Trabajo", "Index", "Contacto")</li>
<li>@Html.ActionLink("Deportes y Fitness", "Index", "Contacto")</li>
<li>@Html.ActionLink("Electronicos y Celulares", "Index", "Contacto")</li>
</ul>
</div>
现在我正在将此代码写入_Layout.cshtml文件。但我想知道在哪里写这个,所以它总是运行,有点像MasterPage。
有什么建议吗?
修改
看来我的初衷是不可能的。
@foreach (var category in ViewBag.Categories)
{
<li>@Html.ActionLink(category.Name, "Index", "Home")</li>
}
有关如何完成我正在尝试做的任何建议?只需提取类别列表并使用foreach循环渲染它们。然后将它放在某处,以便在所有页面上都可以查看。
答案 0 :(得分:1)
与往常一样,您首先要创建一个视图模型:
public class CategoryViewModel
{
public string CategoryName { get; set; }
}
然后在您的控制器中填写视图模型:
public ActionResult Index()
{
var categories = categoryRepo.FindAllCategories();
var model = MapModelToViewModel(categories);
return View(model);
}
最后,您的强类型视图可以使用显示模板。显然,视图将强烈输入IEnumerable
<ul>
@Html.EditorForModel()
<!-- ActionLink goes: Text, ActionName, Controller -->
<li>@Html.ActionLink("Libros", "Index", "Home")</li>
...
</ul>
你的显示模板(〜/ Views / Home / DisplayTemplates / CategoryViewModel.cshtml):
@model YourApp.Models.CategoryViewModel
<li>@Model.CategoryName</li>
正如您可以看到强类型视图和显示模板,您甚至不需要在视图中编写循环。
作为显示模板的替代方案,您可以使用Html.Action
或Html.RenderAction
helers。 Phil Haack写了一篇关于他们的nice blog post。我怀疑您被迫使用丑陋的无类型ViewBag,因为此代码位于主模板中,并且您没有视图模型。没问题,使用Html.Action
你可以有一个特定的控制器来执行此操作:
public class CategoriesController: Controller
{
public ActionResult Index()
{
var categories = categoryRepo.FindAllCategories();
var model = MapModelToViewModel(categories);
return View(model);
}
}
然后有一个相应的局部视图,它将负责渲染类别(~/Views/Categories/Index.cshtml
):
@model IEnumerable<YourApp.Models.CategoryViewModel>
@Html.DisplayForModel()
最后使用相同的显示模板。
现在,在您的母版页中,您可以简单地包含此子操作:
<ul>
@Html.Action("index", "categories")
<!-- ActionLink goes: Text, ActionName, Controller -->
<li>@Html.ActionLink("Libros", "Index", "Home")</li>
...
</ul>
答案 1 :(得分:0)
你正在寻找一种叫做“局部视图”的东西。