Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 选中复选框未显示在ActionResult表单集合MVC 6中_Asp.net Mvc_Checkbox_Collections_Httprequest_Form Submit - Fatal编程技术网

Asp.net mvc 选中复选框未显示在ActionResult表单集合MVC 6中

Asp.net mvc 选中复选框未显示在ActionResult表单集合MVC 6中,asp.net-mvc,checkbox,collections,httprequest,form-submit,Asp.net Mvc,Checkbox,Collections,Httprequest,Form Submit,为了使多个复选框工作,我的代码经历了难以置信的变化。我取消了formsCollection,我试图使用它在视图上的复选框中循环。我在控制器和视图中使用了很多循环,我不再关心“关注点分离”或MVC的任何现代意义。在MS Access中,您可以将一整串函数合并到一行中,这使得它无法读取,但仍然有效。我总是把逻辑展开,以便理解它并逐步理解它。我可能正在用一种二年级的方式来处理MVC6这个新的现代世界,但我不在乎。我可以离开角色垃圾,转而用CRUD做一些事情。我也不想让Stephen Muecke生气,

为了使多个复选框工作,我的代码经历了难以置信的变化。我取消了formsCollection,我试图使用它在视图上的复选框中循环。我在控制器和视图中使用了很多循环,我不再关心“关注点分离”或MVC的任何现代意义。在MS Access中,您可以将一整串函数合并到一行中,这使得它无法读取,但仍然有效。我总是把逻辑展开,以便理解它并逐步理解它。我可能正在用一种二年级的方式来处理MVC6这个新的现代世界,但我不在乎。我可以离开角色垃圾,转而用CRUD做一些事情。我也不想让Stephen Muecke生气,因为我的大部分MVC知识都是他对我的问题的关注。在用Bing搜索之后,我发现非常简单且有用。我的大部分观点已经建立起来了。我的时间花在显示已检查的用户角色上。现在,我有了一个视图和一个编辑表单,可以通过复选框为所选用户添加或删除角色。不漂亮但很好吃。(“MVC6”是我项目的名称,而不是内置名称)。我不必使用Owin依赖项。我必须添加的唯一依赖项是启用会话,以便发送TempData[“Status”]消息。其他一切都是现成的

查看:

    @using MVC6.Models
    @using Microsoft.AspNet.Http
    @model Microsoft.AspNet.Identity.EntityFramework.IdentityUser

    @{
        ViewBag.Title = "Edit User";

        var roles = new MVC6Context().Roles.ToList();
        var usersroles = new MVC6Context().UserRoles.ToList();



    }
    <ol class="breadcrumb">
        <li>@Html.ActionLink("Administration", "Index", "Admin")</li>
        <li>@Html.ActionLink("Users", "Index", "UserManagement")</li>
        <li>Edit User</li>
    </ol>

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary()

        @Html.HiddenFor(model => model.Id)
        @Html.HiddenFor(model => model.Email)
        <h3>Username:</h3>
        <div class="form-control">
            @Model.Email
        </div>

        <h3>Roles:</h3>

        if (roles.Any())
        {
            <div >
                @foreach (var role in roles)
                {
                    bool isinrole = false;

                    @foreach (var ur in usersroles)
                    {
                      @if (Model.Id == ur.UserId) //usersroles returns all roles for all users
                     {
                        @if(ur.RoleId == role.Id)
                        {
                            isinrole = true;
                        }
                      }
                    }

                    @if (isinrole)
                    {
                        <input type="checkbox" name="checkRoles" value="@role.Name" checked />
                        @Html.Label(role.Name)
                    }
                    else
                    {

                        <input type="checkbox" name="checkRoles" value="@role.Name"/>
                        @Html.Label(role.Name)


                    }

                    <br/>
                }
            </div>
            <br />
            <button type="submit" class="btn btn-default">Save</button> <span style="color:red;">@if (@TempData["Status"] != null){@TempData["Status"]}</span>
        }
        else
        {
            <div class="alert alert-info" role="alert">
                No roles available
            </div>
        }
        <br />
@使用MVC6.Models
@使用Microsoft.AspNet.Http
@型号Microsoft.AspNet.Identity.EntityFramework.IdentityUser
@{
ViewBag.Title=“编辑用户”;
var roles=new MVC6Context().roles.ToList();
var usersroles=new MVC6Context().UserRoles.ToList();
}
  • @ActionLink(“管理”、“索引”、“管理”)
  • @ActionLink(“用户”、“索引”、“用户管理”)
  • 编辑用户
  • @使用(Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary() @Html.HiddenFor(model=>model.Id) @Html.HiddenFor(model=>model.Email) 用户名: @模型。电子邮件 角色: if(roles.Any()) { @foreach(角色中的var角色) { bool-isinrole=false; @foreach(usersroles中的var-ur) { @if(Model.Id==ur.UserId)//usersroles返回所有用户的所有角色 { @if(ur.RoleId==role.Id) { isinrole=true; } } } @如果(isinrole) { @Label(role.Name) } 其他的 { @Label(role.Name) }
    }
    保存@if(@TempData[“Status”!=null){@TempData[“Status”]} } 其他的 { 没有可用的角色 }
    控制器

            [HttpGet]
            public ActionResult Edit(string userId)
            {
                return View(context.Users.FirstOrDefault(u => u.Id == userId));
            }
    
            [HttpPost]
            public async Task<ActionResult> Edit(string[] checkRoles, string userID)
            {
    
                var UserManager = _serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
                var RoleManager = _serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
                var allRoles = RoleManager.Roles.ToList();
                var user = await UserManager.FindByIdAsync(userID);           
                var usersRoles = await UserManager.GetRolesAsync(user);
    
                //LOOP THROUGH ROLES
                foreach (var item in allRoles)
                {
                    bool wasChecked = false;
                    //ALL CHECKBOXES THAT WERE CHECKED
                    foreach (var roleChecked in checkRoles)
                    {
                        if (item.Name == roleChecked)
                        {
                            wasChecked = true;
                        }
                    }
    
                    //ALL CHECKBOXES THAT WERE NOT CHECKED
                    if (wasChecked == false)
                    {
                        //IF USER HAS ROLE, REMOVE IT
                        if (await UserManager.IsInRoleAsync(user, item.Name))
                        {
                            await UserManager.RemoveFromRoleAsync(user, item.Name);
                        }
                    }
                    else     //IF CHECK BOX CHECKED THEN ADD ROLE TO USER
                    {
                        await UserManager.AddToRoleAsync(user, item.Name);
                    }
    
                }
    
                TempData["Status"] = "Roles are updated as of <b>" + DateTime.Now.ToShortTimeString() + "</b>";
    
                return View(user);
    
            }
    
    [HttpGet]
    公共操作结果编辑(字符串用户ID)
    {
    返回视图(context.Users.FirstOrDefault(u=>u.Id==userId));
    }
    [HttpPost]
    公共异步任务编辑(字符串[]checkRoles,字符串userID)
    {
    var UserManager=\u serviceProvider.GetRequiredService();
    var rolemager=_serviceProvider.GetRequiredService();
    var allRoles=rolemager.Roles.ToList();
    var user=await UserManager.FindByIdAsync(userID);
    var usersRoles=await UserManager.GetRolesAsync(用户);
    //循环浏览角色
    foreach(所有角色中的变量项)
    {
    bool wasChecked=false;
    //选中的所有复选框
    foreach(checkRoles中的var roleChecked)
    {
    如果(item.Name==roleChecked)
    {
    wasChecked=true;
    }
    }
    //所有未选中的复选框
    如果(wasChecked==false)
    {
    //如果用户具有角色,请将其删除
    if(wait UserManager.IsInRoleAsync(user,item.Name))
    {
    等待UserManager.RemoveFromRoleAsync(用户、项、名称);
    }
    }
    else//如果选中此复选框,则向用户添加角色
    {
    wait UserManager.AddToRoleAsync(user,item.Name);
    }
    }
    TempData[“Status”]=“角色更新日期为“+DateTime.Now.toSortTimeString()+”;
    返回视图(用户);
    }
    

    可能对我这样的新手有所帮助的是,AspNetUserRoles表有两列,UserId和RuleId关系。在我上面的代码中,一旦我获得了关于我要编辑的用户的所有信息,并从多到多获取了所有用户的角色,然后我就可以通过迭代来添加或删除一行。对于视图也是这样。我知道这些东西可以重构,但它正在按我们所说的那样做。我很乐意给那些o甚至对其进行了轻微的重构(但没有将其变成疯狂的科学家gobbly gook,恕我直言).

    不要使用
    FormCollection
    使用视图模型并与您的模型进行强绑定-例如,Oh man。我希望找到一个原因,说明为什么我所做的FormsCollection hack中没有任何内容。我正在升级到MVC 6的MVC 5代码确实看到表单集合,并且