代码之家  ›  专栏  ›  技术社区  ›  Mark Bell

如何做ASP.NET在ViewModel包含来自外部Web服务的对象的情况下使用DataAnnotations进行MVC模型验证?

  •  2
  • Mark Bell  · 技术社区  · 14 年前

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

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

    Client Product 是visualstudio从web服务生成的代理类型,因此我不能直接将注释属性添加到它们所需的属性中。

    using the MetadataType attribute 在另一个类(具有重复属性)中指定元数据,但在本例中,我甚至不能将该属性添加到 产品 班级。

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Mark Bell    14 年前

    经过一番打猎,我发现这其实非常简单,只是我不知道到底要找什么!

    你实际上不需要添加 MetadataType 属性为 起初的 类定义:可以将它添加到同一类型的空分部类中(确保分部类与原始类型位于同一命名空间中)。

    然后您只需创建一个“buddy”类,其中包含您的验证规则,就像您通常所做的那样:

    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; }
        }
    }
    

        2
  •  0
  •   Benjamin Anderson    14 年前

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

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

        3
  •  0
  •   Juan Tarquino    14 年前

    我认为创建一个模型,然后使用AutoMapper和/或modelgenerator Helper映射字段会更干净( http://modelhelper.codeplex.com/ ).