可调整整数(int?)的.NET MVC验证表示输入字段不起作用

时间:2015-05-21 19:06:42

标签: asp.net-mvc forms validation integer

是否有任何推荐/标准的方法来实现这样的MVC代码,验证存储为可空整数(int?)的表单字段是否有效?

我现在遇到的一个根本问题是,如果我输入的东西不是整数,比如" abc123"并尝试提交表单,MVC技术堆栈将在处理任何验证器之前自动将此错误整数值转换为空字符串。因为在我的情况下,空是完全可接受的值,验证器将通过,表单保存看起来正确地进行到最后并且一切看起来都很好,直到用户再次打开更新的表单并且只看到空字段而不是他或她输入的整数。 / p>

首先,我尝试了多个dataAnnotation-validators来解决这个问题,但是没有一个工作,原因似乎是在将值传递给验证器之前将erronoeus整数转换为空字符串。

[Integer]
[RegularExpression("[0-9]{1,}")]
public int? MyTroublesomeIntField { get; set; }

在此之后,我尝试通过实现IModelBinder创建自定义模型绑定器来解决问题。在尝试使用自定义模型绑定器之后,即使在自定义模型绑定器开始运行之前,似乎也会将错误值转换为空字符串。这是我的modelBinder中的几段代码片段:

var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
//f.e. this returns empty string 
value.AttemptedValue 
//f.e. this also returns empty strings, even though name "raw" leads one to      think that this is the value no one has touched.
value.RawValue 
//even this returned empty string even though one could think that by accessing the field from HttpRequest would give access to the truly original value inputted by the user, but no, mvc stack gets to tinker this one as well.
string valueBefore = HttpContext.Current.Request.Form[bindingContext.ModelName]; 

所以在我看来,即使在自定义模型绑定器开始工作之前,MVC技术堆栈的某些部分也会进行此转换(错误的整数输入为空字符串值)。我只是想知道,这种情况发生在哪里,是否有机会对其进行自定义以获取原始值?

我现在一直在想的其他选择是为每个自由输入int创建一个单独的字符串字段?我在系统中的表单字段。对于字符串字段,即使是像RegularExpressions这样的简单数据注释也可以直接使用,主要问题将得到解决。最后,我只需要将所有这些" dummy" -string值中的绑定数据添加到控制器/业务逻辑中某处的实际int?值。但这似乎是一项庞大的工作,因为我在系统中拥有大量的这些内容。令人感到奇怪的是,为了让int工作,还有更多的工作要做,同时,完全类似的apporach可以完美地与double一起工作?目前无法使用int的字段 - 如果我输入包含f.e的错误双精度数。字母,客户端验证将捕获错误。

有什么建议可以在这里进行最佳方式吗?

我的技术堆栈非常像:Razor,MVC5,实体框架,

0 个答案:

没有答案