我在视图中验证了我的奇怪行为。
我的模特有这个属性。
[Display(Name = "Overflow Capacity")]
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
public decimal OverFlowCapacity { get; set; }
我的观点是:
<tr>
<td>@Html.LabelFor(m=> m.OverFlowCapacity)</td>
<td>@Html.EditorFor(m=>m.OverFlowCapacity)</td>
<td> @Html.ValidationMessageFor(model => model.OverFlowCapacity)</td>
</tr>
如果我输入类似'ABC'的值,我会收到验证消息'Number required' 如果我输入值999999,我会收到验证消息“值必须在0 - 9,999.99之间”
当我按预期关闭文本框时,会收到这两条消息。 当我将文本框值保留为空并关闭时,我没有按预期得到任何错误。
但是,当我提交时,我收到验证消息“需要溢出容量字段。”
我不知道这是从哪里来的。我已尝试从模型中删除所有验证属性,但仍然会收到“必需”消息。我很茫然。
以下是我引用的脚本。
我还有mvcfoolproof的其他问题,我稍后会发布。我想知道这是不是以某种方式对我的问题负责。
答案 0 :(得分:8)
现在发生的事情是,在提交表单并确定decimal
值不能为null
之后,帖子验证就开始了。现在您使用的是不可为空的decimal
类型。如果您想要此行为,并且希望在提交表单之前看到验证,则将[Required]
属性添加到属性中。但是,如果您不想要此功能并且可能是null
,那么请将您的类型从decimal
更改为decimal?
或Nullable<decimal>
。
不允许空值并进行预提交验证:
[Display(Name = "Overflow Capacity")]
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
[Required]
public decimal OverFlowCapacity { get; set; }
允许空值并摆脱提交后验证错误:
[Display(Name = "Overflow Capacity")]
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")]
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")]
public decimal? OverFlowCapacity { get; set; }
答案 1 :(得分:1)
由于您没有将十进制类型标记为可为空,因此MVC不知道如何处理您回发的空字段。如果要允许空/空字段,请尝试此操作:
public decimal? OverFlowCapacity { get; set; }
如果您希望它具有要求填写字段的预提交验证消息,请尝试此操作:
[Required]
public decimal OverFlowCapacity { get; set; }
答案 2 :(得分:0)
上面的答案解释了所需的错误消息,所以我只关注第二个错误消息。即如果你把'abc'jquery告诉你“需要数字”。 jquery如何知道此输入应该只接受数字字段。答案是;通过表单字段生成的不显眼的属性。如果你检查输入字段,你会发现像
这样的东西<input name="OverFlowCapacity" id="OverFlowCapacity" data-val-number="Number Required"..../>
因此要覆盖此默认验证消息,您必须使用完全相同的属性(数字验证)来装饰您的模型,并且您可以覆盖验证消息
[Numeric(ErrorMessage="override message")]
[Required(ErrorMessage="override Required message")]
public decimal OverFlowCapacity{get;set;}
我怀疑DataAnnotation或mvc框架中是否存在Numeric属性。你必须检查一下。讨论了一些有用的属性,可用here