Asp.net mvc 在ASP MVC3中的视图中重复视图

Asp.net mvc 在ASP MVC3中的视图中重复视图,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,如果我有一个复杂的重复布局,我只想定义一次,比如说一些奇特的方框网格,但这些方框的内容在视图和模型上会因网格而异(但不在网格内),例如,一个页面有一个奇特的产品摘要,另一个页面有一个奇特的类别介绍。实现MVC3最明智的模式是什么?您可以使用显示模板。例如,在视图模型上定义类型为可枚举的属性: 然后定义一个自定义显示模板,该模板将自动为模型集合的每个元素呈现(~/Views/Shared/DisplayTemplates/SomeViewModel.cshtml): @model SomeView

如果我有一个复杂的重复布局,我只想定义一次,比如说一些奇特的方框网格,但这些方框的内容在视图和模型上会因网格而异(但不在网格内),例如,一个页面有一个奇特的产品摘要,另一个页面有一个奇特的类别介绍。实现MVC3最明智的模式是什么?

您可以使用显示模板。例如,在视图模型上定义类型为可枚举的属性:

然后定义一个自定义显示模板,该模板将自动为模型集合的每个元素呈现(
~/Views/Shared/DisplayTemplates/SomeViewModel.cshtml
):

@model SomeViewModel
@DisplayFor(x=>x.SomeProperty)
...

模板化助手按约定工作。默认情况下,它将首先在
~/Views/CurrentController/DisplayTemplates
文件夹中查找,然后在
~/Views/Shared/DisplayTemplates
文件夹中查找命名方式与集合属性类型相同的模板(
SomeViewModel.cshtml
)。

您可以将重复部分移动到局部视图中。然后,该局部视图可以在任何位置重复使用

Action GenreMenu in Store Controller:

  [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = storeDB.Genres.ToList();

        return PartialView(genres);
    }
在视图中,这将重复局部视图三次:

@for (int i = 0; i < 3; i++)
{
 Html.RenderAction("GenreMenu", "Store");
}
(int i=0;i<3;i++)的
@for
{
RenderAction(“GenreMenu”、“Store”);
}

对不起,如果我使用@Html.DisplayFor(x=>x.Models),那么定义网格布局的循环在哪里?哪里都不适合。框架会自动为您执行此操作,并为每个项目呈现显示模板。您不需要编写任何循环。ASP.NET MVC自动识别模型实现了
IEnumerable
,因此它将为您循环。它按惯例运作。一切都是约定而不是配置。但是网格的html在哪里运行呢?这要看情况而定。您可以在模板外部有一些部分,在模板中有其他部分。这将完全取决于您如何构建网格以及正在使用的组件。默认情况下,显示和编辑器模板位于视图文件夹的EditorTemplates或DisplayTemplates文件夹中,并且模板名称应与您的模型名称匹配,除非您希望手动设置它们。有关某些示例,请参见
@model SomeViewModel
<div>
    @Html.DisplayFor(x => x.SomeProperty)
    ...
</div>
  [ChildActionOnly]
    public ActionResult GenreMenu()
    {
        var genres = storeDB.Genres.ToList();

        return PartialView(genres);
    }
@for (int i = 0; i < 3; i++)
{
 Html.RenderAction("GenreMenu", "Store");
}