【问题标题】:How to do ASP.NET MVC Model Validation with DataAnnotations where ViewModel contains objects from an external Web Service?如何使用 DataAnnotations 进行 ASP.NET MVC 模型验证,其中 ViewModel 包含来自外部 Web 服务的对象?
【发布时间】:2011-03-31 00:51:47
【问题描述】:

我想使用 DataAnnotations 对我的 MVC ViewModel 进行基本的客户端和服务器端验证。我的 ViewModel 如下所示:

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 文件夹中,有一个用于 Web 服务命名空间的文件夹,其中包含一个名为 Reference.cs 的文件,其中包含 VS 为代理类型生成的代码。

如果我将元数据添加到此处的类中,这会起作用吗?还是弄乱生成的代码是一个非常糟糕的主意?还是有更简单、更清洁的方法来做到这一点?

【问题讨论】:

    标签: asp.net-mvc visual-studio-2008 validation model metadata


    【解决方案1】:

    经过一番寻找,我发现这实际上非常简单——只是我不知道要搜索什么!

    您实际上不需要将MetadataType 属性添加到 original 类定义中:您可以将其添加到相同类型的空分部类中(确保您的分部类在与原始类型相同的命名空间)。

    然后您只需像往常一样创建一个包含您的验证规则的“伙伴”类:

    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 轻松设置验证规则,即使对于不属于您的代码库的类型也是如此。

    【讨论】:

      【解决方案2】:

      只要您不重新生成并覆盖您的修改,修改生成的代码即可。除了如果有人生成引用可能会丢失您的工作,您没有理由不能将元数据引用添加到代理类。

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

      【讨论】:

        【解决方案3】:

        我认为创建模型然后使用 AutoMapper 和/或模型生成器助手 (http://modelhelper.codeplex.com/) 映射字段会更简洁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-03
          • 2017-02-20
          • 2011-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-13
          相关资源
          最近更新 更多