【问题标题】:How to change the default "[field value] already taken" error message in ASP.Net MVC 5?如何更改 ASP.Net MVC 5 中的默认“[字段值] 已采用”错误消息?
【发布时间】:2016-12-16 11:19:29
【问题描述】:

ASP.Net MVC 5 View 中,当View 中的控件/输入尝试在数据库中创建列值(或class 中的字段值)时,我们会弹出一条自动错误消息,即应该是唯一的,但我们违反了它 - 例如在使用现有电子邮件创建新用户帐户的电子邮件时,如下所示。

现在,我应该在我的项目中将上面的错误消息更改为本地语言:

... is already taken <-> ... [is already taken in local language]

如何更改“[字段值]已被占用”(自动)错误信息?

根据这篇文章:

Issue with username validation message in asp.net identity

我们可以尝试在整个解决方案中搜索“名称 {0} 已被占用”,但是当我这样做时,我找不到它。

这是早期 MVC 中的有效解决方案,但对于 MVC 5 来说已经过时了吗?

(注意:不幸的是,该帖子没有说明 OP 正在使用哪个 ASP.Net MVC 版本)

【问题讨论】:

  • 你试过DataAnnotations 吗?
  • @SunilKumar 不。如果你知道怎么做,介意举个例子吗?最后,我通过在错误消息被抛出到View 之前拦截错误消息并更改它来解决这个问题。它有效,但对于更多错误消息绝对不是一个好主意。 :/ 如果您知道更好的解决方案,将不胜感激。
  • 您使用的是Asp.Net Identity 还是MembershipProvider

标签: c# asp.net asp.net-mvc asp.net-mvc-5 localization


【解决方案1】:

正如有人回答。我正在纠正一些事情。

在您的帐户控制器中,找到以下类和类似的更改。

private void AddErrors(IdentityResult result)
        {
            foreach (var error in result.Errors)
            {

                string errorMessage = error;
                if (error.EndsWith("is already taken."))
                {
                    errorMessage = "This email id is alreday registered !";
                    ModelState.AddModelError("", errorMessage);
                    break;
                }

                ModelState.AddModelError("", error);
            }
        }

【讨论】:

    【解决方案2】:

    对此的快速且有点老套的解决方案是:

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = UserRepo.CreateUser(model.Email, model.Password);
                if (!result.Succeeded)
                {
                     AddErrors(result);
                }
            }
        }
    
    
    
        private void AddErrors(IdentityResult result)
        {
            foreach (var error in result.Errors)
            {
                string errorMessage = error;
                if (error.EndsWith("is already taken."))
                    errorMessage = "Your error message";
                ModelState.AddModelError("", errorMessage);
            }
        }
    

    【讨论】:

      【解决方案3】:

      我已经通过在System.ComponentModel.DataAnnotations 中使用Remote 实现了这一点。请参考以下代码:

      ViewModel (Properties):

              [Display(Name = "Email")]
              [Remote("IsValidUserName", "Remote", AdditionalFields = "Email", HttpMethod = "Post")]
              public string Email { get; set; }
      

      这里的“Remote”是Controller 名称,“IsValidUserName”是我们的Method。如下:

      public class RemoteController : Controller
          {
              [AcceptVerbs(HttpVerbs.Post)]
              public JsonResult IsValidUserName()
              {
                  string email= Request.Form["Email"];  
                  string message = "Email '"+ email+ "' is already taken";
                  if (!string.IsNullOrEmpty(email))
                  {
                      using (DbContext db = new DbContext())
                      {
                          if (!db.tb_Users.Any(x => x.email== email))
                          {
                              message = string.Empty;
                          }
                      }
                  }
                  if (message == string.Empty)
                      return Json(true, JsonRequestBehavior.AllowGet);
                  else
                      return Json(message, JsonRequestBehavior.AllowGet);
              }
      }
      

      View 页面上,您必须像下面这样使用:

       @Html.TextBoxFor(model => model.Email)
       @Html.ValidationMessageFor(model => model.Email)
      

      输出将是:

      要记住的要点: 您必须使用以下JavaScripts 来运行它:

      <script   src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
      <script   src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.1/jquery.validate.min.jss"></script>
      <script   src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"></script>
      

      希望对你有所帮助。

      谢谢。

      【讨论】:

      • 您好 Sunil,感谢您的回答。我会看看。无论如何,你得到了我的支持。 ;)
      【解决方案4】:

      在您的模型类中,尝试通过在您的属性之前添加以下行来使用数据注释:

      [Required(ErrorMessage = "is already taken in local language")]
      

      如果可能,您可以使用您的语言包安装 .NET Framework。然后,您将收到本地语言的所有错误消息。

      【讨论】:

      • 我已经完成了,但这会更改“必填字段”错误消息,而不是“已被占用”错误消息。这里有两种不同的错误信息:“is required”和“is already taken”
      猜你喜欢
      • 1970-01-01
      • 2013-07-27
      • 2016-12-22
      • 2012-02-15
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2017-03-09
      • 2018-12-01
      相关资源
      最近更新 更多