当要验证的 属性 在模态 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
.
只有两点不同:
- 在第二种情况下,我要远程验证的属性包含在另一个模型中(这是一个问题吗?我不这么认为...)
- 第二种情况,属性显示在里面一个modal bootstrap(是不是有问题?)
有关信息,这是我的 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
用法可能会出现问题
我正在使用 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
.
只有两点不同:
- 在第二种情况下,我要远程验证的属性包含在另一个模型中(这是一个问题吗?我不这么认为...)
- 第二种情况,属性显示在里面一个modal bootstrap(是不是有问题?)
有关信息,这是我的 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
用法可能会出现问题