Asp.net mvc “唯一验证”属性不适用于编辑现有元素

Asp.net mvc “唯一验证”属性不适用于编辑现有元素,asp.net-mvc,Asp.net Mvc,在我的解决方案中添加或编辑用户时,我想验证用户名是否尚未使用 以下是我对远程验证的操作: 视图模型: [Required, Remote("UserNameAlreadyExists", "User", Error="Already exists!")] public string UserName { get; set; } 控制器: public ActionResult UserNameAlreadyExists(string userName) {

在我的解决方案中添加或编辑用户时,我想验证用户名是否尚未使用

以下是我对远程验证的操作:

视图模型:

    [Required, Remote("UserNameAlreadyExists", "User", Error="Already exists!")]
    public string UserName { get; set; }
控制器:

    public ActionResult UserNameAlreadyExists(string userName)
    {
        var user = _requestServiceClient.GetUserFromUserName(userName);
        return Json(user == null, JsonRequestBehavior.AllowGet);
    }
它在创作中非常有效。但它不适用于edition,因为已编辑用户本身的用户名已经存在。你知道我的意思吗

解决方案是基于用户名和用户ID签入数据库。因此,在编辑用户的情况下,我们可以检查用户名是否不存在(作为参数传递的userid除外)。这是一个好的选择吗?如何在远程验证属性中传递此用户标识


谢谢。

如果您的用户在创建后无法更改用户名,请使用不同的视图模型进行编辑,您只需显示
用户名,而无需任何验证

否则,您可以使用该属性向验证器传递额外数据:

public class UserModel
{
    public int Id{ get; set; }

    [Required, Remote("UserNameAlreadyExists", "User", AdditionalFields = "Id")]
    public string UserName { get; set; }
}

public ActionResult UserNameAlreadyExists(string userName, int id)
{
    var user = _requestServiceClient.GetUserFromUserNameAndId(userName, id);
    return Json(user == null, JsonRequestBehavior.AllowGet);
}
您还需要在
表单中包含
Id
属性,例如:

@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.Id)
    @Html.TextBoxFor(m => m.UserName)
    @Html.ValidationMessageFor(x => x.UserName)
    <input type="submit" value="Save" />
}
@使用(Html.BeginForm())
{
@Html.HiddenFor(m=>m.Id)
@Html.TextBoxFor(m=>m.UserName)
@Html.ValidationMessageFor(x=>x.UserName)
}