我想使用远程验证来检查用户名是否存在。我正在使用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>
答案 0 :(得分:0)
我明白了。我阅读了Stephen的帖子几次以及虚拟属性的几个主题。我上床睡觉,起床,并通过删除所有数据模型修改了我的viewmodel。然后,为了在创建时进行验证,我将输入与视图模型中的验证属性进行了比较,而不是实际模型。这适用于创作。然后,当我编辑时,我将输入与实际模型中的验证属性进行比较。当我了解到,您可以对视图模型进行不同的验证,而不是模型中的验证。这个帖子也有帮助:View Model virtual properties and drop down lists。非常感谢!我从中学到了很多东西!