0

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

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
但如果我在上面放一个断点CheckNickname2nickname参数仍然是null

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


解决方案:
好的,通过更改[Bind(Prefix = "MyOtherModel")]Stephen Muecke[Bind(Prefix = "MyOtherModel.Nickname")]的建议来解决

4

1 回答 1

2

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

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

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

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

于 2015-04-28T10:19:44.210 回答