我有一个名为Product
和Category
的商业模式,如下所示我添加了验证:
public class Product
{
public int ProductId {get; set;}
[Required]
[StringLength(25)]
public string Name {get; set;}
public string Description {get; set;}
public int CategoryId {get; set;}
}
public class Category
{
public int CategoryId {get; set;}
public string Name {get; set;}
}
对于视图模型,我创建了这样的东西:
public class ProductViewModel
{
public Product Product {get; set;}
public IList<Category> Categories {get; set;}
}
我的一位朋友建议在视图模型中保留所有验证,并在视图模型中映射业务模型的所有属性,如下所示:
public class ProductViewModel
{
public int ProductId {get; set;}
[Required]
[StringLength(25)]
public string Name {get; set;}
public string Description {get; set;}
public int CategoryId {get; set;}
public IList<SelectListItem> CategoryDropdownValues {get; set;}
}
我告诉他这种方法对上述方法的好处,他不是很确定。但他坚持认为您不应该直接在您的视图中使用商业模式,并且只应该验证查看模型。
我的问题:
答案 0 :(得分:3)
你的朋友是对的。关于你的问题
有用户输入验证和业务规则验证。大多数情况下,输入验证是业务规则验证的一部分,但是在asp.net mvc中,框架会自动进行验证。为了防止重复,这意味着UI验证应该使用业务验证。这可以通过FluentValidations轻松完成(数据注释过于严格IMO)。
因此,在这种情况下,使用业务模型验证在UI级别完成UI vlaidation。
视图模型总是至少在一定程度上取决于商业模式,但不一样。它们是具有不同用途的不同型号,因此它们应保持分离。事实上,您的视图模型与业务(以及数据结构)模型的90%完全相同只是巧合。我们希望将每个模型保留在自己的图层中,只是它们具有相同的属性。
答案 1 :(得分:3)
验证应保持在域/业务级别;否则你会发现自己在整个应用程序中复制了验证规则。这是所有服务和表示层将与之交互的最低标准。
在演示文稿视图模型中使用域模型是一个不同的问题,有利有弊。在您的特定情况下,使用特定于视图的视图模型包装模型可能会减轻您遇到的一些重复。但是,请确保不要像在需要时那样在视图模型中“转储”模型:这会很快损害性能,因为正在加载大量不必要的信息。
ASP.NET MVC框架将正确解析和验证System.ComponentModel.DataAnnotations
namespace中的属性。您可以使用这些来注释您的域模型,如果需要,您可以使用仅限于MVC框架的组件来扩充视图模型演示。
答案 2 :(得分:2)
我会在视图模型中保留验证。这就是MVC从中获取元数据的地方。此外,验证属性在MVC程序集中定义。您不希望将MVC依赖项添加到业务逻辑或UI以外的任何其他内容。 UI模型可以依赖于业务模型,但不是相反。我还建议您阅读一些最佳实践文章,例如:http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx
答案 3 :(得分:2)
一般来说,您的UI应该引用视图模型,您的视图模型应该是模型的包装器。模型的工作是为业务对象建模,视图模型的工作是调整该信息,以便在UI中显示。
在我正在处理的代码库中,我们为简单模型多次使用此快捷方式。但是,随着代码的发展,您会发现需要向UI添加新功能,而这些功能对模型本身并没有多大意义。如果你现在不添加那个视图模型,一个天真的程序员肯定会出现,并将UI位直接添加到模型中。
对于验证,我同意您可能希望模型本身;这意味着模型总是经过验证,无论它在何处显示。
但是......可能存在视图模型上应该进行验证的情况:想象一个显示产品列表的视图模型,并包含一个过滤器字段,以便您可以缩小搜索项目的列表范围。如果不允许过滤器,比如说,有“&amp;”其中的字符,然后验证将放在视图模型上,而不是模型。
答案 4 :(得分:1)
那么,如何在UI中验证输入呢? - 是的,您需要使用MVC视图模型上的DataAnnotations属性在某种程度上复制验证。我认为这更适合SRP,因为验证Web输入和验证业务规则不是一回事。
答案 5 :(得分:0)
将验证尽可能保持在最低级别,即类。这就是MVC自动检查验证的方式。