如何删除 MVC2 的验证消息

本文关键字:MVC2 验证 消息 删除 何删除 | 更新日期: 2023-09-27 18:34:31

我正在使用 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); %>

如何删除 MVC2 的验证消息

此处遇到的此问题是因为要绑定的属性是数字,并且模型绑定会自动处理字符串无法转换为数字的事实。 这不是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 项目中引用它。

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