我想使用DataAnnotations进行MVC ViewModel的基本客户端和服务器端验证。我的ViewModel看起来像这样:
public class MyViewModel
{
public Client Client1 { get; set; }
public Client Client2 { get; set; }
public Product Product { get; set; }
}
所以我想检查两个客户端对象是否有名称和电话号码,产品对象是否有有效的数字价格等。
我遇到的问题是Client
和Product
都是Visual Studio从Web服务生成的代理类型,因此我无法直接将注释属性添加到其所需的属性中。
我已经阅读了using the MetadataType
attribute来指定替代类中的元数据(具有重复属性),但在这种情况下,我甚至无法将该属性添加到Client
和{{ 1}}类。
或者我可以吗?在保存我的VS解决方案的Web References文件夹中,有一个Web服务命名空间的文件夹,其中包含一个名为Product
的文件,其中包含VS生成的代理类型代码。
如果我将元数据添加到这里的类中,这是否有效 - 或者是否正在搞乱生成的代码是一个非常糟糕的主意?或者只是有一种更简单,更清洁的方法吗?
答案 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/)映射字段会更清晰。