C# 使用同一表单.net标识注册多个用户

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

我的ASP.NET MVC应用程序中有一个动态内嵌表单,当用户单击按钮(在本例中为“添加”)时,它将向表单中添加一个新行,其中包含所需的字段。我正试图让这个与ASP.Net身份,但没有任何运气

我相信这将类似于拥有一个列表,然后在列表中做一个for-a循环来注册用户,但将其付诸实践被证明是令人困惑的

    <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)
{
返回重定向到操作(“索引”、“主页”);
}
加法器(结果);
}
//如果我们走到这一步,有些东西失败了,重新显示形式
返回视图(模型);
}
  • 创建包含UserViewModel类型列表的视图模型。我使用了
    EmployeeListViewModel
  • 用这个做你的表格。我们需要静态定义输入字段,因为我们需要在名称上使用0索引,如
    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>
    }