我正在使用 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")]
为Stephen Muecke[Bind(Prefix = "MyOtherModel.Nickname")]
的建议来解决