C# 远程验证可用于创建或编辑,但不能同时用于创建和编辑
我想使用远程验证来检查用户名是否存在。我正在使用Viewmodel创建用户。虽然我可以这样做以获得创建或编辑目的的验证,但它不能同时用于创建和编辑。这是我的模型:C# 远程验证可用于创建或编辑,但不能同时用于创建和编辑,c#,jquery,asp.net-mvc,validation,C#,Jquery,Asp.net Mvc,Validation,我想使用远程验证来检查用户名是否存在。我正在使用Viewmodel创建用户。虽然我可以这样做以获得创建或编辑目的的验证,但它不能同时用于创建和编辑。这是我的模型: [Required] [Display(Name = "Homeowner Username")] [Remote("doesUserNameExist", "Homeowners", HttpMethod = "POST", ErrorMessage = "User name already exists.
[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>
这是我的控制器,用于编辑但不创建(创建时,两个参数均为null):
我尝试过很多不同的方法,但都没能成功
我在这里看过:
在这里:
在这里:
但我似乎错过了什么。有没有一种方法可以让我在编辑和注册时都能做到这一点?我对这方面还很陌生,如果有任何想法,我将不胜感激
编辑:
也许这是一个糟糕的设计选择(第一次使用视图模型,只编码了几个月),但我试图创建一个新的屋主和地址,就像我创建一个新的应用程序用户一样。以下是我正在使用的viewmodel:
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);
}
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务注册器Homeowner(注册器HomeOwnerServiceWModel模型、地址、房屋所有者房屋所有者)
{
ApplicationDbContext db=新的ApplicationDbContext();
if(ModelState.IsValid)
{
var user=newapplicationuser{UserName=model.Email,Email=model.Email};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
var role=db.Roles.Find(“0”);
UserManager.AddToRole(user.Id,role.Name);
等待SignInManager.SignInAsync(用户,isPersistent:false,rememberBrowser:false);
db.address.Add(地址);
homeowner.UserId=user.Id;
homeowner.AddressID=address.ID;
db.屋主。添加(屋主);
db.SaveChanges();
返回操作(“索引”、“房主”);
}
加法器(结果);
}
返回视图(模型);
}
以下是我用来创建这些实体的视图:
<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>
RegisterViewModel
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@LabelFor(model=>model.Homeowner.Username,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.Homeowner.Username,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Homeowner.Username,“,new{@class=“text danger”})
@LabelFor(model=>model.Email,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.Email,new{htmlAttributes=new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.Email,“,new{@class=“text danger”})
就我所知,除了对用户名进行远程验证之外,其他一切都正常工作。我可以让它在上面的account方法中创建时给我一个错误,或者我可以通过删除前缀在编辑时得到一个错误(这使得我的用户名无法识别。显然我做错了什么。我明白了。我读了几次Stephen的帖子,读了几篇关于虚拟财产的文章。我上床睡觉,起床,通过删除所有数据模型修改了我的viewmodel。然后,为了在创建时进行验证,我将输入与验证pr进行了比较我的视图模型中的属性,而不是实际模型中的属性。这可用于创建。然后,当我编辑时,我将我的输入与实际模型中的验证属性进行比较。当我了解到可以对视图模型进行与模型中不同的验证时,这是有意义的。此线程也有帮助:。非常感谢!我从是!显示创建方法的视图。如果您使用的是视图模型,那么您为什么要使用
houseowner.InitialUsername
而不是简单的InitialUsername
。并且使用绑定(Include=“…”
没有意义(您没有发布模型)。创建时怎么会有InitialUsername
?我编辑了我的帖子,并提供了一些详细信息。我可以按照您的建议更改InitalUsername,但在尝试编辑时仍然无法同时获取用户名和InitalUsername。感谢上面帖子中的提示。在我无法获取Init之前ialUsername.A不应包含数据模型,当然也不应包含虚拟属性。但您试图如何处理远程
属性(您迄今为止显示的内容毫无意义)。在任何情况下,您都需要两个单独的模型来创建和编辑)谢谢你的建议。我真的很感激。明白了。非常感谢斯蒂芬!你直截了当的指导真的帮了大忙。
[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>