MVC3属性验证问题

时间:2011-07-27 23:45:54

标签: asp.net-mvc-3 data-annotations validation

我在视图中验证了我的奇怪行为。

我的模特有这个属性。

    [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的其他问题,我稍后会发布。我想知道这是不是以某种方式对我的问题负责。

3 个答案:

答案 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