【问题标题】:How can I remove MVC2's validation messages?如何删除 MVC2 的验证消息?
【发布时间】:2012-05-16 08:43:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您在这里遇到的这个问题是因为被绑定的属性是数字,并且模型绑定会自动处理字符串无法转换为数字的事实。这不是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 在您的控制器方法中找到该错误并在返回视图结果之前将其删除...

    【讨论】:

    • 您好安德拉斯,感谢您的建议。我知道使用字符串作为数据类型,但在这种情况下,我真的需要保持数据类型不变,而且我不能使用 hacky 方法。我需要将此解决方案应用于需要持续支持的大型项目。
    • 不幸的是,您将不得不重新考虑DefaultModelBinder - 因为我相信这是验证消息的来源。你说它确实需要保存为int;但是根据我的经验,您应该准备好在模型类型上更加灵活;除非你想写很多自定义代码。无论如何-使用我更新的代码,您甚至不会注意到后端有什么不同...
    • @WilliamCalleja 抱歉,我在更新代码之前写了我的评论,以为我会很快......它现在更新了。恐怕没有改变答案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多