受影响的mvc编辑中的远程验证

1 validation asp.net-mvc asp.net-mvc-4

我试图通过客户端的远程验证来验证用户名,并且在创建模块中添加重复字段时工作正常,但现在它不允许我使用相同的名称编辑记录它显示了我定义的相同错误用于创造.我尝试了所有可能的方法但没有成功请帮助我.我已经按照这些链接但它无论如何都无法正常工作.

http://stackoverflow.com/questions/4778151/asp-net-mvc-3-remote-validation-to-allow-original-value http://stackoverflow.com/questions/6407096/asp-net-mvc-3 -remote属性-传球-3-字段

这是我的代码到目前为止我尝试过的.请帮助专家.

[Required]
        [Remote("IsUserAvailable", "User", HttpMethod = "Post", ErrorMessage = "User already exist.", AdditionalFields = "InitialUserName")]
        [RegularExpression(@"^(?![\W_]+$)(?!\d+$)[a-zA-Z0-9 ]+$", ErrorMessage = "Invalid UserName ")]
 public string UserName { get; set; }


[HttpPost]
    public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName)
    {

        var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName);
        if (result == null)
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
        return Json(JsonRequestBehavior.AllowGet);
    }


@model User.ViewModel.ViewModelUser
@using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        @Html.HiddenFor(m => m.User.UserId)



                @Html.LabelFor(m.User.UserName)


               @Html.TextBoxFor(m => m.User.UserName)
                @Html.ValidationMessageFor(m.User.UserName)
                @Html.Hidden("initialUserName", Model.User)
            </div>
        </div>
}
Run Code Online (Sandbox Code Playgroud)

请帮助专家完成我的任务.

小智 5

User 似乎是一个复杂的对象

@Html.Hidden("initialUserName", Model.User)
Run Code Online (Sandbox Code Playgroud)

可能会产生类似的东西

<input type="hidden" name="initialUserName" value="YourAssemly.User" ... />
Run Code Online (Sandbox Code Playgroud)

这对验证没有帮助.

您可以通过使用发送回原始名称来忽略验证

@Html.Hidden("InitialUserName", Model.User.UserName)
@Html.Hidden("User.InitialUserName", Model.User.UserName)
Run Code Online (Sandbox Code Playgroud)

然后使用控制器比较控制器中的值

public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, string initialUserName)
public JsonResult IsUserAvailable([Bind(Prefix = "User.UserName")]string UserName, [Bind(Prefix = "User.InitialUserName")]string initialUserName)
{
  if (UserName == initialUserName)
  {
    // Nothing has changed so signal its valid
    return Json(true, JsonRequestBehavior.AllowGet);
  }
  // Check if the user name already exists
  var result = uDbContext.Users.FirstOrDefault(a => a.UserName == UserName);
  return Json(result == null, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

附注:jquery远程验证是GET调用,因此[HttpPost]不需要该属性

编辑

在调试了两个jquery-validate.jsjquery-validate-unobtrusive.js文件后,事实证明any的name属性AdditionalFields必须包含与要验证的属性相同的前缀,并且[Bind(Prefix="..")]该方法中的那些参数也需要该属性(参见上面的修正)

例如,另一种方法可能是创建一个简单的类来回发

public class ValidateUserNameVM
{
  public string UserName { get; set; }
  public string InitialUserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public JsonResult IsUserAvailable([Bind(Prefix = "User")]ValidateUserNameVM model)
{
  if (model.UserName == model.InitialUserName)
  ....
Run Code Online (Sandbox Code Playgroud)