【问题标题】:Data type validation with xVal使用 xVal 进行数据类型验证
【发布时间】:2009-08-31 16:49:07
【问题描述】:

我正在尝试找出在 MVC C# 应用程序中验证数据的最佳方式,而 xVal 似乎是最合适的。但是我遇到了数据类型验证的问题。

起初我在 DTO 中执行 UpdateModel,然后在 DTO 上运行验证。这对于诸如必填字段之类的东西非常有用,但是如果您尝试将字符串(“asd”)映射到十进制字段,UpdateModel 会抛出异常。由于必须在有任何数据验证之前运行 UpdateModel,我不知道如何解决这个问题。

我的解决方案是为 UpdateModel 复制到的每个表单创建一个 DTO,对其运行验证,然后将值复制到适当的 DTO 中。表单 DTO 上的所有属性都是字符串,因此 UpdateModel 永远不会爆炸,我将通过 xVal 强制执行数据验证。然而,虽然像 required 这样的规则正在启动,但我似乎无法启动 DataType 规则(在这种情况下尝试 DataType.Currency)。

我也尝试过让客户端验证工作,但我希望有一种干净的方法来对数据类型进行服务器端验证。

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

【问题讨论】:

  • 只是为了确保:DTO 是指您的自定义 ViewModel 吗?

标签: c# asp.net validation xval


【解决方案1】:

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

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

这将确保数据始终到达 xVal,在那里我可以运行我想要的验证,并且一旦我知道我有有效数据,然后将其转换为正确的类型,例如 DateTime。

【讨论】:

    【解决方案2】:

    我正在使用从 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。

    【讨论】:

    • 验证不是问题,它是在验证之前存储它的位置。理想情况下,我希望它在不需要视图模型的情况下复制到 DTO——例如货币字段会变成小数等。但是,一旦您尝试将字符串输入 int 字段并使用 UpdateModel 复制字段将表单形成为视图模型或 DTO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多