【问题标题】:how to handle remote attribute validation in controller submit method properly如何正确处理控制器提交方法中的远程属性验证
【发布时间】:2014-09-05 06:16:47
【问题描述】:

这是我的模特

  [Required(ErrorMessage="Current password is required")]
    [Remote("IsCorrectOldPassword", "Account", ErrorMessage = "The password you gave is incorrect.")]
    [DataType(DataType.Password)]
    [Display(Name = "Current Password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(20, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New Password")]
    public string NewPassword { get; set; }

这是我的看法

 @using (Ajax.BeginForm("ChangePassword", "Account", new AjaxOptions { HttpMethod = "POST", OnSuccess = "AfterSave()", UpdateTargetId = "formcontents" }, new { @id = "formSavePwd" }))
            {
                @Html.AntiForgeryToken()
                @Html.ValidationSummary(true)

@@Html.HiddenFor(m => m.UserId)@

                <table style="width: 100%">

                    @*<caption>Change Password Form</caption>*@

                    <tr>
                        <td>@Html.LabelFor(m => m.OldPassword)


                        </td>
                        <td>
                            @Html.PasswordFor(m => m.OldPassword, new { @enabled = true, maxlength = 20, size = 20 })
                            @Html.ValidationMessageFor(m => m.OldPassword)
                        </td>
                    </tr>

                    <tr>
                        <td>@Html.LabelFor(m => m.NewPassword)

                        </td>
                        <td>
                            @Html.PasswordFor(m => m.NewPassword)
                           @* @Html.ValidationMessageFor(m => m.NewPassword)*@

                        </td>
                    </tr>

这是我的控制器

 public ActionResult ChangePassword(LocalPasswordModel passwordModel)
     {

         if (ModelState.IsValid)
         {
             var user = new FcpUserDto();
             user.ClientId = (Int64) SessionObjects.ClientId;
             user.ClientKey = Guid.NewGuid().ToString();
             user.LoginPassword = passwordModel.NewPassword;
             user.DateModified = DateTime.Now;
             user.UserId = (long) passwordModel.UserId;
             StatusDto statusDto = _FcpEndpoint.ChangePassword(user);
             //return Json(true, JsonRequestBehavior.AllowGet);
         }
         else
         {
             var model = new LocalPasswordModel();



             var languageItems = (from ResourceLabels.UserManagementlabels resourceLabel in Enum.GetValues(typeof(ResourceLabels.UserManagementlabels))
                                  select new FcpLanguageItemsDto
                                  {
                                      ClientId = SessionObjects.ClientId,
                                      LanguageId = SessionObjects.ClientLanguageId,
                                      ObjectId = (long)resourceLabel,
                                      ObjectType = (short)EnumObjectType.SRM_SCREEN_LABELS,
                                      TokenId = (long)EnumPhrase.Label
                                  }).ToList();
             model.ResourceLabelModel = WebMapper.CreateResourceLabelModelList(_FcpEndpoint.GetPhrases(languageItems));
             ModelState.AddModelError("", "");
             return PartialView("_ChangePasswordPartial",model);
             //return Json(false, JsonRequestBehavior.AllowGet);
         }



        return null;
     }

在提交控制器方法被调用但远程属性验证不起作用,我不知道我错过了什么我的远程属性方法只是没有被调用。 下面是我对 IsCorrectOldPassword 的操作方法

 public JsonResult IsCorrectOldPassword(string OldPassword)
     {
         const string errorHTML = "<span class='Error'><div class='Validation-Error-Text errorImg'   > </div><div class='MSGReg'>{0}</div></span>";
         const string IncorrectOldPwd = "The password you gave is incorrect.";
         //if (FcpLocalPasswordDto.IsCorrectOldPassword(new FcpLocalPasswordDto()
         //{
         //    UserId = SessionObjects.UserId,
         //    OldPassword = OldPassword
         //}).IsSuccessful)

         var userPassword = new FcpLocalPasswordDto();
         userPassword.OldPassword = OldPassword;
         userPassword.UserId = SessionObjects.UserId;

        StatusDto statusDto = _FcpEndpoint.IsCorrectOldPassword(userPassword);
        //if successful
        if (statusDto.IsSuccessful) 
        {
            return Json(string.Format(errorHTML, IncorrectOldPwd), JsonRequestBehavior.AllowGet); 
        }

        return Json(true, JsonRequestBehavior.AllowGet);
     }   

【问题讨论】:

  • 发布IsCorrectOldPassword的操作方法
  • 我在帖子中添加了 IsCorrectOldPassword 方法
  • 请注意您的某些方法在这里做了什么,但从您命名它们的方式来看,if (statusDto.IsSuccessful) 应该返回true 而不是错误消息?是否在方法中设置断点并单步执行代码?
  • 我的错,哦,是的,应该是 **if (!statusDto.IsSuccessful) ** @StephenMuecke 但问题是 IsCorrectOldPassword 没有被命中
  • 浏览器控制台有错误吗?

标签: javascript jquery asp.net-mvc-4 asp.net-ajax unobtrusive-validation


【解决方案1】:

只需要添加 jquery.validate.js 和上面的代码就可以正常工作了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多