3

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

1 回答 1

2

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

相反,您可能会考虑将新属性作为 astring并派生您自己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并在返回视图结果之前将其删除......

于 2012-05-16T09:03:54.737 回答