当要验证的 属性 在模态 Bootstrap 内时,远程验证不起作用

Remote validation doesn't work when property to validate is inside a modal Bootstrap

我正在使用 ASP.NET MVC3。
当用户创建帐户时,我需要选择的昵称是唯一的,所以我使用 Remote DataAnnotation 像这样:

public class UserModel
{
    [Required]
    [Remote("CheckNickname", "Validation", ErrorMessage = "This nickname is already used")]
    public string Nickname { get; set; }

    // ...
}

我通过 @Html.TextBoxFor(m => m.Nickname) 在强类型视图中使用它并且它 完美工作


但是,我创建了另一个完全相同的模型 属性。

public class MyOtherModel
{
    // ...

    [Required]
    [Remote("CheckNickname", "Validation", ErrorMessage = "This nickname is already used")]
    public string Nickname { get; set; }
}

我通过 :
在强类型视图上使用了这个 MyOtherModel.Nickname @Html.TextBoxFor(m => m.MyOtherModel.Nickname) 但是,仅在这种情况下,传递给我的 CheckNickame() 方法的数据始终是 null.

只有两点不同:

有关信息,这是我的 CheckNickname() 的样子:

public JsonResult CheckNickname(string nickname)
{
    UserDAL userDAL = new UserDAL();
    bool userIsAvailable = !userDAL.IsUserAlreadyInUse(nickname);

    return Json(userIsAvailable, JsonRequestBehavior.AllowGet);
}

正如我之前写的,仅在第二种情况下,参数 nickname 始终是 null 而在第一种情况下它按预期工作。

有谁知道为什么吗?
感谢任何帮助。


更新:
我创建了这个方法:

public JsonResult CheckNickname2([Bind(Prefix = "MyOtherModel")]string nickname)
{
    UserDAL userDAL = new UserDAL();
    bool userIsAvailable = !userDAL.IsUserAlreadyInUse(nickname);

    return Json(userIsAvailable, JsonRequestBehavior.AllowGet);
}

电话现在是:
http://mysite/Validation/CheckNickname2?MyOtherModel.Nickname=Alex
但是如果我在 CheckNickname2 上放置一个断点,nickname 参数仍然是 null !

但是,对工作验证方法的调用是:
http://mysite/Validation/CheckNickname?Nickname=Alex
这个有效...


解决方案:
好的,按照

的建议,通过将 [Bind(Prefix = "MyOtherModel")] 更改为 [Bind(Prefix = "MyOtherModel.Nickname")] 来解决

在您的第二个示例中,生成的 html 将是 name="MyOtherModel.Nickname",因此回发的 key/value 对将是 MyOtherModel.Nickname:yourValue。将控制器方法更改为

public JsonResult CheckNickname([Bind(Prefix="MyOtherModel.Nickname")]string nickname)

这将有效地去除前缀并正确绑定到参数 nickname

另请注意,如果这是在呈现初始页面后添加动态内容(在这种情况下您需要重新解析验证器),modal 用法可能会出现问题