2010-08-17 51 views
2

我想使用DataAnnotations进行MVC ViewModels的基本客户端和服务器端验证。我的视图模型看起来是这样的:如何使用DataAnnotations进行ASP.NET MVC模型验证其中ViewModel包含来自外部Web服务的对象?

public class MyViewModel 
{ 
    public Client Client1 { get; set; } 
    public Client Client2 { get; set; } 
    public Product Product { get; set; } 
} 

所以我想检查两个客户对象有一个名字和电话号码,产品对象具有有效的数字价格等

我的问题是, ClientProduct都是Visual Studio从Web服务生成的代理类型,所以我不能直接将注释属性添加到其所需的属性中。

我读过using the MetadataType attribute指定的替代类中的元数据(具有重复属性),但在这种情况下,我甚至不能将该属性添加到ClientProduct类。

或者我能吗?在保存我的VS解决方案的Web References文件夹中,存在一个名为Reference.cs的Web服务名称空间的文件夹,其中包含代理类型的VS生成代码。

如果我将元数据添加到这里的类中,这是否会工作 - 或者正在搞乱生成的代码是一个非常糟糕的主意?还是只有一个更简单,更清洁的方式来做到这一点?

回答

3

经过一番狩猎后,我发现这实际上非常简单 - 这只是我不知道要搜索什么的情况!

你实际上并不需要的MetadataType属性添加到类的定义:您可以将其添加到空部分类相同类型的(请确保您的局部类是在同一个命名空间为原类型)。

然后你只需创建一个包含您的验证规则“伙伴”类,你通常会:

using System.ComponentModel.DataAnnotations; 

namespace WebServiceNamespace 
{ 
    [MetadataType(typeof(ClientMetaData))] 
    public partial class Client 
    { 
    } 

    public class ClientMetaData 
    { 
     [Required(ErrorMessage = "Please enter a name")] 
     public string Name { get; set; } 

     [Required(ErrorMessage="Please enter a telephone Number")] 
     public string Telephone { get; set; } 
    } 
} 

这工作完全与标准模型绑定,无需访问原始代码的类型,所以您可以使用DataAnnotations轻松设置验证规则,即使对于不属于您的代码库的类型也是如此。

0

只要您不重新生成并修改修改,修改生成的代码就可以工作。除了在有人生成引用时丢失工作的机会之外,没有理由不能将元数据引用添加到代理类。

另一种方法是使用自定义验证,或者创建一个模型,然后将这些字段映射到代理对象。创建一个不基于Client对象的模型将是最安全的方法。

相关问题