我正在使用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); %>
答案 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
在控制器方法中发现错误并在返回查看结果之前将其删除...