前段时间做项目的时候发现,ASP.NET MVC中CompareAttribute的ErrorMessage自定义错误信息设置无效,没有办法显示我们自己定义的错误信息,而是显示默认的错误信息!经过研究发现这是MVC 5.0的一个BUG,现在官方已经修复了这个BUG,只要用NuGet将ASP.NET MVC包升级到5.0以上就可以了。
相关的BUG说明:https://aspnetwebstack.codeplex.com/workitem/1401
项目中View视图的代码:
@using (Html.BeginForm("Register", "Account", FormMethod.Post))
{
<input type="hidden" name="ReturnUrl" value="@ViewBag.ReturnUrl" />
<div class="form-group">
<label>账号:</label>
@Html.TextBoxFor(m => m.AccountName, new { @class = "form-control", placeholder = "输入账号" })
@Html.ValidationMessageFor(m => m.AccountName)
</div>
<div class="form-group">
<label>密码:</label>
@Html.PasswordFor(m => m.AccountPassword, new { @class = "form-control", placeholder = "输入密码" })
@Html.ValidationMessageFor(m => m.AccountPassword)
</div>
<div class="form-group">
<label>确认密码:</label>
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control", placeholder = "再次输入密码" })
@Html.ValidationMessageFor(m => m.ConfirmPassword)
</div>
<div class="form-group">
<input type="submit" value="注册用户" class="btn btn-success btn-block" />
</div>
}
Model:
/// <summary>
/// 注册视图模型
/// </summary>
public class RegisterViewModel
{
[XmlElement("账号名称")]
[Required(ErrorMessage = "请输入账号!")]
[StringLength(50, ErrorMessage = "账号名称不能超过50个字符!")]
public string AccountName { get; set; }
[XmlElement("账号密码")]
[Required(ErrorMessage = "请输入密码!")]
public string AccountPassword { get; set; }
/// <summary>
/// 确认密码
/// </summary>
[XmlIgnore]
[Required(ErrorMessage = "请输入确认密码!")]
[System.ComponentModel.DataAnnotations.Compare("AccountPassword", ErrorMessage = "两次输入的密码不一致!")]
public string ConfirmPassword { get; set; }
}
虽然我们在RegisterViewModel类的ConfirmPassword 属性上设置了Compare验证,并且自定义了错误信息"两次输入的密码不一致!",但实际上每当验证没有通过的时候,显示的却是默认的错误信息!
解决ErrorMessage自定义错误设置无效的方法
1、使用NuGet升级ASP.MVC程序包到5.0以上,这是最佳的方法!5.0以上版本已经修复此BUG,本文发布前已经到5.22版本了。
打开NuGet程序包管理器,并打开 更新->nuget.org 查看最新的程序包更新。
找到Microsoft ASP.NET MVC 并更新,最好连上面的中文资源也更新下,如果在更新列表没找到只能自己手动输入命令更新了。
更新完成后看下当前的版本,本文发表的时候最新版本是5.22。
2、在视图界面上重新声明自定义错误信息,这个方法也只是临时的方案:
@Html.ValidationMessageFor(Model => Model.ConfirmPassword, "两次输入的密码不一致")
3、在实体的属性上使用System.Web.Mvc命名空间的CompareAttribute,而不使用System.ComponentModel.DataAnnotations.CompareAttribute:
[System.Web.Mvc.Compare("AccountPassword", ErrorMessage = "两次输入的密码不一致!")]
但是强烈建议不要这么做,因为System.Web.Mvc.CompareAttribute是已经过时的,如果使用了VS会有警告提示!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98377.html