ASP.NET MVC 3:不引人注目的JavaScript验证

时间:2011-03-05 19:24:25

标签: validation asp.net-mvc-3 unobtrusive-javascript

关于如何“创建自己的模型”有a lot of examples。使用DataAnnotations标记它们。 Scott Guthrie解释了validate your model使用ORM时的方法。我找不到的是你的模型实际上是从外部DLL进来的。你如何验证它?

示例:

/* Class coming in from an third-party DLL file. */
public class Person
{
    public string Name{get;set;}
    public int Age {get;set;}
}

我正在考虑的解决方案:继承外部类,然后将[MetadataType]应用于继承的类。

[Metadata(typeof(Person2_Validation))]
public class Person2:Person{}

public class Person2_Validation
{
    [Required,Stringlength(50,ErrorMessage="Name required"]
    public string Name{get;set;}

    [RegularExpression("([0-9]+)")]
    public int Age
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

您可以创建模型并使用Mapper(如AutoMapper或EmitMapper或ValueInjecter)在对象之间进行映射,并根据映射模型进行验证。

当您需要将对象传回时,您可以在模型与收到的模型之间进行映射。

这与ASP.NET MVC中的ViewModel方法非常相似。

所以它是这样的:

A类(来自DLL的类) B级(您的模型)

您可以在B上设置所有注释,并创建所需的任何属性。

你使用的是B.当你从存储库/来源获得某些东西时,你映射(复制所有相关的值)A => B并发送它(比如在视图中作为模型)。

当你收到B回来时,你验证它,然后以另一种方式映射B => A,并将其发送到存储库/服务。

顺便说一句:我建议使用这种方法,即使模型A是你的类。

Why use ViewModels instead of Domain Models in Views.

答案 1 :(得分:2)

@Linkgoron回答是真的。您正在搜索视图模型与域模型。我们需要认为来自dll的模型是一个域模型,并将其映射到我们自己的视图模型,就像我们在处理自己的存储库/持久性时所做的那样。这是一种最佳做法。不用担心映射器,它会自动映射。

查看此示例: http://weblogs.asp.net/shijuvarghese/archive/2010/02/01/view-model-pattern-and-automapper-in-asp-net-mvc-applications.aspx

请参阅@Nick DeVore回答为什么在此处查看模型而不是域模型 Why Two Classes, View Model and Domain Model?

以及

Bestpractice - Mixing View Model with Domain Model

您的问题可能是其中一个原因:)