2012-04-03 110 views
0

这是我的情况:我的应用程序中有许多专门的对象类型,我遵循标准约定在/Shared/DisplayTemplates文件夹中使用自定义模板显示它们,并使用/Shared/EditorTemplates中的模板编辑它们。但我也希望能够为每种类型显示自定义过滤器模板,所以我想添加一个/Shared/FilterTemplates文件夹,并实施我自己的@Html.FilterFor方法,以便显示过滤器模板就像显示一个显示或编辑器模板。什么是ASP.NET MVC中自定义模板类型的正确设计模式?

这似乎是处理这种情况的最佳方式,还是有更正确/优雅的方式在MVC中做到这一点?提前致谢。

+0

什么是FilterTemplate? – 2012-04-03 15:31:48

+0

假设你有一个Id字段。显示模板将其显示在标签中,编辑器模板将其显示在文本框中。过滤器模板将显示一个自定义用户界面,例如显示两个文本框“From”和“To”,以允许您指定一系列用于过滤行的Id值,仅获取Id在这个范围内。对于所有其他字段和数据类型也是如此。或者,也许名称字段会显示一个文本框,并让您指定通配符或正则表达式模式,以便您可以找到名称与该模式匹配的行。 – 2012-04-03 15:41:39

+0

您的解决方案有什么问题我认为这是一种正确的方式来编写您的自定义模板 – 2012-04-03 15:43:29

回答

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,但我不会)

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

+0

谢谢,这帮助我澄清了我需要做的事情。你是对的,这不是说有一种独立的模板,而是有一种独立的ViewModel,它反过来被显示或编辑。 – 2012-04-03 18:33:24

0

我想你误解了模板的工作方式。模板在您描述的上下文中没有意义。

模板工作在数据项目(尽管该数据项目可以包含多个数据项目,它们又有自己的模板)。

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

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