如何使用DataAnnotations进行ASP.NET MVC模型验证,其中ViewModel包含来自外部Web服务的对象?

时间:2010-08-17 14:36:44

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

我想使用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来指定替代类中的元数据(具有重复属性),但在这种情况下,我甚至无法将该属性添加到Client和{{ 1}}类。

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

如果我将元数据添加到这里的类中,这是否有效 - 或者是否正在搞乱生成的代码是一个非常糟糕的主意?或者只是有一种更简单,更清洁的方法吗?

3 个答案:

答案 0 :(得分: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设置验证规则,即使对于不属于您的代码库的类型也是如此。

答案 1 :(得分:0)

修改生成的代码将起作用,只要您不重新生成它并写下您的修改即可。除了有人生成引用而失去工作的可能性之外,没有理由不能将元数据引用添加到代理类中。

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

答案 2 :(得分:0)

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