如何删除MVC2的验证消息?

时间:2012-05-16 08:43:08

标签: c# asp.net asp.net-mvc-2 client-side-validation

我正在使用ASP.NET C#MVC2,我在具有以下数据注释验证属性的模型中有以下字段:

[DisplayName("My Custom Field")]
[Range(long.MinValue, long.MaxValue, ErrorMessage = "The stated My Custom Field value is invalid!")]
public long? MyCustomField{ get; set; }

在此字段中,如果用户尝试输入无法表示为数字的值,则此字段应允许用户将其留空并显示验证消息。从验证的角度来看,这是按预期工作并显示以下错误消息:

  

声明的我的自定义字段值无效!

     

“我的自定义字段”字段必须是数字。

第一个验证消息是我写的自定义验证消息,第二个验证消息是MVC2自动生成的消息。我需要摆脱第二个,因为它是多余的。我该怎么做呢?在我看来,我有以下标记

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
   { %>
   <%:Html.ValidationSummary(false)%>
   <% Html.ValidateFor(m => m.MyCustomField); %>

1 个答案:

答案 0 :(得分:2)

这里遇到的问题是因为绑定的属性是数字,模型绑定会自动处理字符串无法转换为数字的事实。这不是RangeAttribute所做的。

您可以考虑将新属性视为string并派生自己的RangeAttribute,它在字符串级别工作,首先解析数字。

然后你有你现有的属性换行字符串:

 [DisplayName("My Custom Field")]
 [MyCustomRangeAttribute(/* blah */)] //<-- the new range attribute you write
 public string MyCustomFieldString
 {
   get; set;
 }

 public int? MyCustomField
 {
   get 
   { 
     if(string.IsNullOrWhiteSpace(MyCustomField))
       return null;
     int result;
     if(int.TryParse(MyCustomField, out result))
       return result;
     return null;
   }    
   set
   {
      MyCustomFieldString = value != null ? value.Value.ToString() : null;
   }
 }

您的代码可以继续在int?属性上继续工作,但是 - 所有模型绑定都是在字符串属性上完成的。

您还可以理想地将[Bind(Exclude"MyCustomField")]添加到模型类型中 - 以确保MVC不会尝试绑定int?字段。或者你可以做到internal。如果它在Web项目中,您只需要在Web项目中引用它。

您还可以考虑真正的hacky方法 - 并通过ModelState.Errors在控制器方法中发现错误并在返回查看结果之前将其删除...