我试图找出一个MVC C#应用程序中验证数据的最佳方式,并XVAL似乎是最合适的。但是我正在与数据类型的验证问题。

起初我做一个的UpdateModel到DTO,然后运行对DTO的验证。这对于像必填项伟大的工作,但是如果你尝试,例如,(“ASD”)映射一个字符串转换成十进制场的UpdateModel会抛出异常。由于的UpdateModel不得不跑之前有任何的数据来验证,我不知道怎么去解决这一问题。

我的解决方案是创建每形式的UpdateModel将复制到,运行验证上,一个DTO,然后将复制的值出到适当的DTO。所有的形式DTO的属性将是字符串,这样的UpdateModel从未炸弹出来,我会通过XVAL执行数据验证。然而尽管规则一样需要被踢,我似乎无法得到的数据类型规则踢(在这种情况下试图DataType.Currency)。

我还曾试图获取客户端验证工作,但我一直希望有一个干净的方式做数据类型的服务器端验证。

有什么与别人做方面对服务器端验证数据类型?

有帮助吗?

解决方案

我最终什么事做创建一些DTO的代表形式。这些DTO的将采取的Request.Form并自动所有形式的值映射到基于它们是相同的名称作为表格值的内部属性(例如公共字符串的电子邮件,公共字符串姓名)。

他们将拥有所有的字符串属性和我把对他们的XVAL属性。然后我会使用XVAL和正则表达式,以确保未来的数据是有效的(如有效日期,电子邮件,电话号码等)。这样,永远不会有异常抛出,因为它总是会转换为字符串,而不是净试图解析为一个日期或东西。

这将确保数据总是让它XVAL在那里我可以运行我想要的验证和然后的将其转换为正确的类型一样的DateTime一旦我知道我有有效数据。

其他提示

我使用从ValidationAttribute衍生用于确认应在服务器侧被解析从字符串到其它数据类型的数据的自定义验证器。例如:

public class DateAttribute : ValidationAttribute
    {

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

我还发现了一个办法把这样的验证属性分为客户端和服务器端验证,而无需编写任何自定义JavaScript代码属性。我只是从一个不同的验证属性的基类派生。看看我的博客文章关于客户端验证如果您想了解更多关于这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top