2011-07-27 82 views
2

我在我的视图中验证了我的奇怪行为。MVC3属性验证问题

我的模特拥有此属性。

[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”的值,我得到“所需数量” 确认消息。如果我输入的999999值,我得到的验证消息“值必须介于0 - 9,999.99之间'

这两个消息都是在我按预期方式标签出文本框时收到的。 当我将文本框的值保留空白并关闭标签时,我无法获得正常预期的错误。

但是,当我提交时,我收到一条验证消息'需要溢出容量字段'。

我不知道这是从哪里来的。我尝试从模型中删除所有验证属性,并仍然获得“必需”消息。我很茫然。

这里是我引用的脚本。

我有mvcfoolproof其他问题,我以后可能会发布。我想知道这是不是对我的问题负责。

回答

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; } 
+0

恕我直言只需要的属性将使没有差异的错误消息,因为你不重写它 –

+0

谢谢亚历山大。我对MVC相当陌生,所以有时甚至是明显的逃脱我。我只在阅读答案的前两行后才知道解决方案。 –

+0

@穆罕默德你是正确的,它不会影响他已经得到的错误,但添加它会让你看到验证,一旦领域失去焦点,然后提交。我不确定杰夫是否想要这个错误,所以我把这个解决方案包括在内并将其删除。 –

1

由于您没有将十进制类型标记为可空,因此MVC不知道如何处理您发布的空白字段。如果你想允许空/空场试试这个:

public decimal? OverFlowCapacity { get; set; } 

,如果你希望它有一个预先提交需要现场确认消息填写试试这个:

[Required] 
public decimal OverFlowCapacity { get; set; } 
0

答案解释所需的错误消息相当好,所以我只专注于第二个错误消息。即如果你把'abc'jquery告诉你“Number Required”。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框架中。你必须检查。有一些有用的属性讨论和可用here

+0

所需的数量来自正则表达式验证。 –