2009-08-31 183 views
2

我试图找出在MVC C#应用程序中验证数据的最佳方法,并且xVal似乎是最合适的。不过,我遇到了数据类型验证的问题。使用xVal验证数据类型

起初我正在做一个UpdateModel到DTO中,然后在DTO上运行验证。对于像必需字段这样的事情来说,这非常适用,但是如果您试图将字符串(“asd”)映射到十进制字段,则UpdateModel会引发异常。由于在有任何数据需要验证之前必须先运行UpdateModel,所以我不确定如何解决这个问题。

我的解决方案是创建一个UpdateModel将复制到每个窗体的DTO,对其进行验证,然后将值复制到适当的DTO中。 DTO表单上的所有属性都是字符串,所以UpdateModel永远不会弹出,我会通过xVal强制执行数据验证。然而,虽然像所需的规则踢,我似乎无法得到DataType规则踢(在这种情况下尝试DataType.Currency)。

我也试过让客户端验证工作,但我希望有一个干净的方式来做数据类型的服务器端验证。

其他人在服务器端验证数据类型方面做了些什么?

+0

只是为了确保:通过DTO,你的意思是你的自定义ViewModel? – 2009-09-02 18:56:38

回答

2

我最终做的是创建一些代表形式的DTO。这些DTO将接受一个Request.Form并自动将所有表单值映射到内部属性(例如公共字符串电子邮件,公共字符串firstname),基于它们与表单值的名称相同。

他们将具有所有字符串属性,我会把xVal属性放在它们上面。然后,我会使用xVal和正则表达式来确保进入的数据是有效的(例如有效的日期,电子邮件,号码等)。这样就永远不会抛出异常,因为它总是进入一个字符串,而不是.Net试图将它解析为日期或其他东西。

这将确保数据始终将其转换为xVal,我可以运行我想要的验证,然后然后将其转换为适当的类型,如DateTime,一旦我知道我有有效的数据。

1

我使用派生自ValidationAttribute的自定义验证器来验证应该在服务器端从字符串解析到其他数据类型的数据。例如:

public class DateAttribute : ValidationAttribute 
    { 

     public override bool IsValid(object value) 
     { 
      var date = (string)value; 
      DateTime result; 
      return DateTime.TryParse(date, out result); 
     } 
    } 

我还发现了一个办法把这样的验证属性分为客户端和服务器端验证,而无需编写任何自定义JavaScript代码属性。我只需要从不同的验证属性基类派生。看看我的blog article about client-side validation如果你想了解更多这方面的信息。

+0

验证不是问题,它在验证之前就存储在哪里。理想情况下,我希望它复制到DTO而不需要视图模型 - 例如货币字段会变成小数等等。但是,如果尝试在int字段中输入字符串并使用UpdateModel复制字段将窗体形成为视图模型或DTO。 – Parrots 2009-09-04 14:34:21