我的View或ViewModel是否应分配了DataType

时间:2014-04-04 14:39:28

标签: asp.net-mvc razor

哪种方法具有更好的可维护性和可扩展性?

每种方法的限制/限制在哪里?

将DataType放在ViewModel

OR

将DataType / Control类型放在视图中?

视图模型

[DataType(DataType.MultilineText)]
public string LongDescription { get; set; }

OR

查看

@Html.TextAreaFor(m => m.LongDescription)

3 个答案:

答案 0 :(得分:1)

就可维护性而言,在视图模型中定义它是最好的。

考虑到你的例子,假设我们在VM中有这个:

[DataType(DataType.MultilineText)]
public string LongDescription { get; set; }

这在我们的视图中:

@Html.EditorFor(m => m.LongDescription);

现在让我们说一些要求已经改变,一个简单的字符串不再为你的LongDescription剪切它,比如你创建了一个特殊的CustomRichTextFormat类来存储它。您可以将VM更改为如下所示:

public CustomRichTextFormat LongDescription { get; set; }

然后,您可以创建名为CustomRichTextFormat.cshtml的EditorTemplate并将其放在View文件夹的EditorTemplates文件夹中,并且由于您在原始视图中使用了@Html.EditorFor(m => m.LongDescription);,因此MVC将足够智能显示您为CustomRichTextFormat类型的任何字段定义的自定义编辑器。

总而言之,这种方法的优势在于,尽管ViewModel中字段的基础类型发生了变化,但您拥有一个真正通用的View,不需要任何更改。

答案 1 :(得分:0)

在我看来,我建议让ViewModel包含DataType。原因是因为您可以为viewModel执行类似的操作。

@Html.EditorFor(m => m);

这将减少视图中所需的标记量。

答案 2 :(得分:0)

一般来说,使用EditorFor会更强大,因为这会尝试猜测给定模型元素所需的编辑器。它足够智能,可以选择自定义编辑器模板,您可以在其中为给定类型定义模板。例如,如果您有图像的自定义编辑器,则可以使用EditorFor语法,视图引擎将为您解析编辑器。

这是一个很好的解决方案,因为它可以减少重复信息的数量;您只需在一个地方指定类型信息,创建其他组件可以读取的单一事实来源以做出决策。这也意味着如果您对模型的类型进行更改,视图仍将为这些类型生成合适的编辑器。

然而,有时EditorFor无法产生您需要的结果,此时您必须更接近金属并调用适当的HtmlHelper方法,甚至自己创建扩展方法。

您需要使用这两种方法;不要担心选择其中一个,因为它们都满足不同的需求。一般情况下,EditorFor会为您提供更少的代码,但在特殊情况下不要羞于解决问题。