C# 使用同一表单.net标识注册多个用户
我的ASP.NET MVC应用程序中有一个动态内嵌表单,当用户单击按钮(在本例中为“添加”)时,它将向表单中添加一个新行,其中包含所需的字段。我正试图让这个与ASP.Net身份,但没有任何运气 我相信这将类似于拥有一个列表,然后在列表中做一个for-a循环来注册用户,但将其付诸实践被证明是令人困惑的C# 使用同一表单.net标识注册多个用户,c#,asp.net,asp.net-mvc,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Identity,我的ASP.NET MVC应用程序中有一个动态内嵌表单,当用户单击按钮(在本例中为“添加”)时,它将向表单中添加一个新行,其中包含所需的字段。我正试图让这个与ASP.Net身份,但没有任何运气 我相信这将类似于拥有一个列表,然后在列表中做一个for-a循环来注册用户,但将其付诸实践被证明是令人困惑的 <input name="__RequestVerificationToken" type="hidden" value=""> <div class="row"&g
<input name="__RequestVerificationToken" type="hidden" value=""> <div class="row">
<div class="form-group mx-1">
<label class="control-label" for="Email">Email</label>
<input name="Email" class="form-control" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" placeholder="Email" type="text" value="">
</div>
<div class="form-group mx-1">
<label class="control-label" for="User_Role">User Role</label>
<select name="UserRoles" class="form-control" data-val="true" data-val-required="The UserRoles field is required." id="UserRoles" ><option value="">Role</option>
<option value="Employee">Employee</option>
<option value="Manager">Manager</option>
</select>
</div>
<div class="form-group mx-1">
<label class="control-label" for="Password">Password</label>
<input name="Password" class="form-control valid validate-equalTo-blur" data-val="true" data-val-length="The Password must be at least 6 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Password" placeholder="Password" type="password" value=""aria-describedby="Password-error" aria-invalid="false">
</div>
<div class="form-group mx-1">
<label class="control-label" for="ConfirmPassword">Confirm password</label>
<input class="form-control valid" name="ConfirmPassword" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="ConfirmPassword" placeholder="Confirm Password" type="password" value="" aria-describedby="ConfirmPassword-error" aria-invalid="false">
</div>
<button type="button" class="btn btn-sm btn-info add_button form-control col-md-1" style="margin-top: 37px"><i class="fas fa-plus"></i></button>
电子邮件
用户角色
角色
雇员
经理
密码
确认密码
电子邮件
用户角色
角色
雇员
经理
密码
确认密码
提交
Jquery表单:
$(document).ready(function () {
var max_fields = 10; //maximum input boxes allowed - change as needed
var wrapper = $(".field_wrapper"); //Fields wrapper
var add_button = $(".add_button"); // class add button
var remove_button = $('.remove_button'); // class remove button
var html = `
<div class="form-group row">
<fieldset class="form-group mx-1">
@Html.LabelFor(m => m.Email, new { @class = "control-label" })
@Html.TextBoxFor(m => m.Email, new { @class = "form-control", placeholder="Email" })
</fieldset>
<fieldset class="form-group mx-1">
@Html.Label("User Role", new { @class = "control-label" })
@Html.DropDownList("UserRoles", (SelectList)ViewBag.Name, "Role", new { @class = "form-control"})
</fieldset>
<fieldset class="form-group mx-1">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
@Html.TextBoxFor(m => m.Password, new { @class = "form-control", placeholder="Password" })
</fieldset>
<fieldset class="form-group mx-1">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "control-label" })
@Html.TextBoxFor(m => m.ConfirmPassword, new { @class = "form-control", placeholder="Confirm Password" })
</fieldset>
<a href="#" class="btn btn-sm btn-danger remove_button form-control col-md-1" style="margin-top: 37px"><i class="fas fa-times center"></i></a>
</div>`;
var x = 1; //initlal count
$(add_button).click(function (e) { //on add button click
e.preventDefault();
if (x < max_fields) { //max input box allowed
x++; // increment value of x
$('.counter').text(x);
$(wrapper).append(html); //add html
}
});
$(wrapper).on("click", remove_button, function (e) { // runs when a user clicks on anything with the class 'remove_button'
e.preventDefault(); // prevent default, duh
$(this).parent('div').remove(); // get parent of each element and remove it
x--; // decrement the value of x
$('.counter').text(x); // update text with the count only after value of x has been changed
})
});
$(文档).ready(函数(){
var max_fields=10;//允许的最大输入框数-根据需要更改
var wrapper=$(“.field_wrapper”);//字段wrapper
var add_button=$(“.add_button”);//类add button
var remove_button=$('.remove_button');//类移除按钮
变量html=`
@LabelFor(m=>m.Email,新的{@class=“control label”})
@TextBoxFor(m=>m.Email,新的{@class=“formcontrol”,placeholder=“Email”})
@Label(“用户角色”,新的{@class=“control Label”})
@DropDownList(“UserRoles”,(SelectList)ViewBag.Name,“Role”,new{@class=“form control”})
@LabelFor(m=>m.Password,新的{@class=“control label”})
@TextBoxFor(m=>m.Password,新的{@class=“form control”,placeholder=“Password”})
@LabelFor(m=>m.ConfirmPassword,新的{@class=“control label”})
@TextBoxFor(m=>m.ConfirmPassword,新的{@class=“formcontrol”,placeholder=“ConfirmPassword”})
`;
var x=1;//初始计数
$(添加按钮)。单击(函数(e){//在添加按钮上单击
e、 预防默认值();
如果(x
My AccountController方法-我有一个employee类,该类继承了标识模型并使用了自己的视图模型:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RegisterEmployees(EmployeeViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务注册表员工(EmployeeViewModel模型)
{
if(ModelState.IsValid)
{
var user=newapplicationuser{UserName=model.Email,Email=model.Email};
var result=await UserManager.CreateAsync(用户、模型、密码);
if(result.successed)
{
返回重定向到操作(“索引”、“主页”);
}
加法器(结果);
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
EmployeeListViewModel
李>
Model.UsersToRegister[0]。Email
李>
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务注册表员工(EmployeeListViewModel模型)
{
if(ModelState.IsValid)
{
foreach(model.UsersToRegister中的var u){
var user=newapplicationuser{UserName=u.Email,Email=u.Email};
var result=await UserManager.CreateAsync(用户,u.Password);
如果(!result.successed){
break;//如果用户创建失败,是否要停止创建用户取决于您
//continue;//如果用户创建失败,是否继续创建用户取决于您
}
}
if(result.successed)
{
返回重定向到操作(“索引”、“主页”);
}
加法器(结果);
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
我很确定前面的答案是可行的,但您在询问这个问题时发表了评论,所以您可以这样回答:
我已经尽力使它尽可能简单,所以您必须添加自己的额外标记、样式、数据注释等
模型
非常不言自明,我们只是有一个视图模型,其中有一个用户模型列表
public类寄存器lotsmodel
{
公共列表UserStoreRegister{get;set;}
}
公共类用户注册器
{
公共字符串用户名{get;set;}
公共字符串电子邮件{get;set;}
公共字符串密码{get;set;}
}
看法
只是一个简单的表单,其中包含一些字段输入,用于注册用户。周围的div在JS中被引用,并在我们为额外的用户附加HTML时使用
@model BulkRegister.Models.RegisterLotsModel
@using (Html.BeginForm("BulkRegister"))
{
<div class="users-to-register">
<div class="user-container">
<input type="text" name="UsersToRegister[0].UserName" />
<input type="email" name="UsersToRegister[0].Email" />
<input type="password" name="UsersToRegister[0].Password" />
</div>
</div>
<input type="button" id="add-user-button" value="Add another user" />
<input type="submit" value="Register the users" />
}
@section scripts {
<script src="~/Scripts/bulk-reg.js"></script>
}
控制器动作
没什么特别的
public ActionResult BulkRegister()
{
返回视图();
}
POST:循环模型中的用户,并向UserManager注册它们。您需要添加验证和任何您想做的事情来报告成功和失败
[HttpPost]
公共异步任务。Hi,是否编辑var html
以包含html生成的结果?我们是
public class EmployeeListViewModel{
public List<EmployeeViewModel> UsersToRegister {get;set;}
}
@model EmployeeListViewModel
// please edit with your parameters
@Html.BeginForm(){
// add validate forgery token html helper
<div class="form-group mx-1">
<label class="control-label" for="Email">Email</label>
<input name="Model.UsersToRegister[0].Email" class="form-control" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" placeholder="Email" type="text" value="">
</div>
<div class="form-group mx-1">
<label class="control-label" for="User_Role">User Role</label>
<select name="Model.UsersToRegister[0].UserRoles" class="form-control" data-val="true" data-val-required="The UserRoles field is required." id="UserRoles" >
<option value="">Role</option>
<option value="Employee">Employee</option>
<option value="Manager">Manager</option>
</select>
</div>
<div class="form-group mx-1">
<label class="control-label" for="Password">Password</label>
<input name="Model.UsersToRegister[0].Password" class="form-control valid validate-equalTo-blur" data-val="true" data-val-length="The Password must be at least 6 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Password" placeholder="Password" type="password" value=""aria-describedby="Password-error" aria-invalid="false">
</div>
<div class="form-group mx-1">
<label class="control-label" for="ConfirmPassword">Confirm password</label>
<input class="form-control valid" name="Model.UsersToRegister[0].ConfirmPassword" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="ConfirmPassword" placeholder="Confirm Password" type="password" value="" aria-describedby="ConfirmPassword-error" aria-invalid="false">
</div>
<button type="button" class="btn btn-sm btn-info add_button form-control col-md-1" style="margin-top: 37px"><i class="fas fa-plus"></i></button>
}
<script>
var x = 1; //initlal count
$(add_button).click(function (e) { //on add button click
e.preventDefault();
if (x < max_fields) { //max input box allowed
var html = "
<div class='field_wrapper'>
<div class='form-group row'>
<fieldset class='form-group mx-1'>
<label class='control-label' for='Email'>Email</label>
<input name='Model.UsersToRegister["+x+"].Email' class='form-control' data-val='true' data-val-email='The Email field is not a valid e-mail address.' data-val-required='The Email field is required.' id='Email' placeholder='Email' type='text' value=''>
</fieldset>
<fieldset class='form-group mx-1'>
<label class='control-label' for='User_Role'>User Role</label>
<select name='Model.UsersToRegister["+x+"].UserRoles' class='form-control' data-val='true' data-val-required='The UserRoles field is required.' id='UserRoles' ><option value=''>Role</option>
<option value='Employee'>Employee</option>
<option value='Manager'>Manager</option>
</select>
</fieldset>
<fieldset class='form-group mx-1'>
<label class='control-label' for='Password'>Password</label>
<input name='Model.UsersToRegister["+x+"].Password' class='form-control' data-val='true' data-val-length='The Password must be at least 6 characters long.' data-val-length-max='100' data-val-length-min='6' data-val-required='The Password field is required.' id='Password' placeholder='Password' type='text' value=''>
</fieldset>
<fieldset class='form-group mx-1'>
<label class='control-label' for='ConfirmPassword'>Confirm password</label>
<input name='Model.UsersToRegister["+x+"].ConfirmPassword' class='form-control' data-val='true' data-val-equalto='The password and confirmation password do not match.' data-val-equalto-other='*.Password' id='ConfirmPassword' placeholder='Confirm Password' type='text' value=''>
</fieldset>
<a href='#' class='btn btn-sm btn-danger remove_button form-control col-md-1' style='margin-top: 37px'><i class='fas fa-times center'></i></a>
</div>
</div>
";
x++; // increment value of x
$('.counter').text(x);
$(wrapper).append(html); //add html
}
});
</script>
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RegisterEmployees(EmployeeListViewModel model)
{
if (ModelState.IsValid)
{
foreach(var u in model.UsersToRegister){
var user = new ApplicationUser { UserName = u.Email, Email = u.Email };
var result = await UserManager.CreateAsync(user, u.Password);
if(!result.Succeeded){
break; // depends on you if you want to stop creating users if one failed
// continue; // depends on you if you want to continue creating users if one failed
}
}
if (result.Succeeded)
{
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
@model BulkRegister.Models.RegisterLotsModel
@using (Html.BeginForm("BulkRegister"))
{
<div class="users-to-register">
<div class="user-container">
<input type="text" name="UsersToRegister[0].UserName" />
<input type="email" name="UsersToRegister[0].Email" />
<input type="password" name="UsersToRegister[0].Password" />
</div>
</div>
<input type="button" id="add-user-button" value="Add another user" />
<input type="submit" value="Register the users" />
}
@section scripts {
<script src="~/Scripts/bulk-reg.js"></script>
}