远程验证适用于创建或编辑,但不适用于

时间:2016-08-28 06:38:39

标签: c# jquery asp.net-mvc validation

我想使用远程验证来检查用户名是否存在。我正在使用Viewmodel来创建用户。虽然我可以这样做以获得创建或编辑目的的验证,但它不适用于创建和编辑。这是我的模特:

    [Required]
    [Display(Name = "Homeowner Username")]
    [Remote("doesUserNameExist", "Homeowners", HttpMethod = "POST", ErrorMessage = "User name already exists. Please enter a different user name.", AdditionalFields = "InitialUsername")]

这是我的编辑视图:

    @Html.Hidden("Homeowner.InitialUsername", Model.Username)


    <div class="form-group">
        @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
        </div>
    </div>

以下是我的控制器版本,适用于注册但不能编辑(编辑时,参数为空):

    public JsonResult doesUserNameExist([Bind(Prefix = "Homeowner.Username")]string Username, [Bind(Prefix = "InitialUsername")] string InitialUsername)  
    {
       MY CODE
    }

这是我的控制器,用于编辑但不能创建(创建时,两个参数都为空):

    public JsonResult doesUserNameExist([Bind(Include = "Homeowner.Username")]string Username, [Bind(Include = "InitialUsername")] string InitialUsername)  
    {
       MY CODE
    }

我尝试了很多这方面的变化,但却无法得到它。

我看过这里:ASP.NET MVC Binding with Remote Validation

这里:

Remote ViewModel validation of nested objects not working

在这里:http://forums.asp.net/t/1652512.aspx?Compound+View+Model+object+causing+remote+validation+failure

但我似乎错过了一些东西。有没有办法让这项工作能够进行编辑和注册?我对此非常陌生,非常感谢任何想法!

编辑:

也许这是一个糟糕的设计选择(第一次使用视图模型,只编写了几个月),但我试图创建一个新的房主和地址,同时我在那里创建一个新的应用程序用户角色。这是我正在使用的视图模型:

public class RegisterHomeownerViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
    public int roles { get; set; }
    public virtual Address Address { get; set; }
    public virtual Homeowner Homeowner { get; set; }
}

以下是帐户控制器中的方法:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> RegisterHomeowner(RegisterHomeownerViewModel model, Address address, Homeowner homeowner)
    {
        ApplicationDbContext db = new ApplicationDbContext();

        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {

                var role = db.Roles.Find("0");
                UserManager.AddToRole(user.Id, role.Name);
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                db.Addresses.Add(address);
                homeowner.UserId = user.Id;
                homeowner.AddressID = address.ID;
                db.Homeowners.Add(homeowner);
                db.SaveChanges();


                return RedirectToAction("Index", "Homeowners");

            }
            AddErrors(result);
        }

        return View(model);
    }

以下是我用来创建这些实体的视图:

<div class="form-horizontal">
    <h4>RegisterViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.Homeowner.Username, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Homeowner.Username, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Homeowner.Username, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
        </div>
    </div>

除了用户名上的远程验证之外,所有内容都可以正常工作。我可以在上面的帐户方法中创建时给我一个错误,或者在编辑时通过删除前缀(这使得我的用户名无法被识别)时会出现错误。显然我做错了。< / p>

1 个答案:

答案 0 :(得分:0)

我明白了。我阅读了Stephen的帖子几次以及虚拟属性的几个主题。我上床睡觉,起床,并通过删除所有数据模型修改了我的viewmodel。然后,为了在创建时进行验证,我将输入与视图模型中的验证属性进行了比较,而不是实际模型。这适用于创作。然后,当我编辑时,我将输入与实际模型中的验证属性进行比较。当我了解到,您可以对视图模型进行不同的验证,而不是模型中的验证。这个帖子也有帮助:View Model virtual properties and drop down lists。非常感谢!我从中学到了很多东西!