ASP.NET MVC中自定义模板类型的正确设计模式是什么?

时间:2012-04-03 15:08:56

标签: asp.net-mvc asp.net-mvc-3

以下是我的情况:我的应用程序中有许多专门的对象类型,我遵循标准约定,在/Shared/DisplayTemplates文件夹中使用自定义模板显示它们,并使用模板编辑它们/Shared/EditorTemplates。但我也希望能够为每种类型显示自定义过滤器模板,因此我想添加/Shared/FilterTemplates文件夹,并实现我自己的@Html.FilterFor方法,以便显示过滤器模板与显示或编辑模板完全一样。

这是否是处理这种情况的最佳方式,还是在MVC中有更正确/更优雅的方法?提前谢谢。

2 个答案:

答案 0 :(得分:1)

当数据发送回服务器时,我总是使用EditorTemplates。我假设用户可以将过滤器提交给服务器以执行实际过滤。

创建过滤器时,我更喜欢为过滤器创建一个模型,如:

public class UserListFilterModel
{
    public string Username { get; set; }
    public bool IsEnabled { get; set; }
}

UserListFilterModel的视图进入EditorTemplates / UserListFilterModel.ascx。

然后将其添加为我的页面视图模型的属性。

public class MyPageViewModel
{
    public UserListFilterModel Filter { get; set; }
}

然后我将过滤器模型添加到页面的模型中,并显示如下:

<%= Html.EditorFor(x => x.Filter)%>

您可能在表单中包装过滤器以允许用户提交值,因此我认为它属于EditorTemplates。用户实际上正在编辑过滤器模型。

(如果你真的想把它们分开,你可以使用UIHintAttribute,但我不会)

编辑:我添加了一些示例代码。

答案 1 :(得分:0)

我认为您误解了模板的工作原理。模板在您描述的上下文中没有意义。

模板适用于 SINGLE 数据项(尽管该数据项可以包含多个数据项,而这些数据项又有自己的模板)。

过滤器的概念是控制多个数据项,因此它们不能很好地映射到模板。

您可以做的是为您的集合类创建一个添加过滤的DisplayTemplate,因此无需创建自定义类型的模板。只需使用DisplayTemplates。