我应该把这段代码放在哪里?

时间:2010-12-12 23:59:15

标签: asp.net-mvc controller

这是编写为在控制器中编写的代码:

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循环渲染它们。然后将它放在某处,以便在所有页面上都可以查看。

2 个答案:

答案 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.ActionHtml.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)

你正在寻找一种叫做“局部视图”的东西。