我正在尝试找出在MVC C#app中验证数据的最佳方法,xVal似乎是最合适的。但是我遇到了数据类型验证的问题。
首先,我在DTO中执行UpdateModel,然后在DTO上运行验证。这对于像必填字段这样的东西很有用,但是如果您尝试将字符串(“asd”)映射到十进制字段,则UpdateModel会抛出异常。由于UpdateModel必须在有任何数据验证之前运行,因此我不确定如何解决这个问题。
我的解决方案是为UpdateModel复制到其中的每个表单创建一个DTO,对其运行验证,然后将值复制到适当的DTO中。表单DTO上的所有属性都是字符串,因此UpdateModel永远不会爆炸,我将通过xVal强制执行数据验证。然而,虽然像需要的规则正在发挥作用,但我似乎无法启动DataType规则(在这种情况下尝试DataType.Currency)。
我也试过让客户端验证工作,但我希望有一种干净的方法来对数据类型进行服务器端验证。
其他人在服务器端验证数据类型方面做了什么?
答案 0 :(得分:2)
我最终做的是创建一些代表表单的DTO。这些DTO将获取Request.Form并自动将所有表单值映射到内部属性(ex public string email,public string firstname),基于它们与表单值相同。
他们将拥有所有字符串属性,并且我将xVal属性放在它们上面。然后我使用xVal和正则表达式来确保进入的数据是有效的(从有效日期,电子邮件,数字等)。这种方式永远不会抛出异常,因为它总是进入字符串,而不是.Net试图将其解析为日期或其他东西。
这样可以确保数据总是在xVal上运行我想要的验证,然后然后将其转换为类似DateTime的正确类型,一旦我知道我有有效的数据。< / p>
答案 1 :(得分: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。