Asp.net mvc 4 ASP.Net MVC-更改dropdownlist后无法设置@Html.Checkbox的值

Asp.net mvc 4 ASP.Net MVC-更改dropdownlist后无法设置@Html.Checkbox的值,asp.net-mvc-4,html.checkbox,Asp.net Mvc 4,Html.checkbox,我到处找类似的东西,什么也找不到。。 我正在使用ASP.NETMVC4。我正在构建一个页面,以便我的应用程序中的用户可以管理与每个角色关联的权限。 因此,我有一个@htmlDropDownList视图来显示所有可用的角色,下面是一个@Html.CheckBox,用于上面选择的角色的每个权限 第一次呈现视图时,根据该角色的权限,所有复选框都设置为true或false。一切正常,生活愉快:。当drop的值更改时,我使用$.ajax发布SelectedRoleId。然后,获取新选定角色的所有权限。 在

我到处找类似的东西,什么也找不到。。 我正在使用ASP.NETMVC4。我正在构建一个页面,以便我的应用程序中的用户可以管理与每个角色关联的权限。 因此,我有一个@htmlDropDownList视图来显示所有可用的角色,下面是一个@Html.CheckBox,用于上面选择的角色的每个权限

第一次呈现视图时,根据该角色的权限,所有复选框都设置为true或false。一切正常,生活愉快:。当drop的值更改时,我使用$.ajax发布SelectedRoleId。然后,获取新选定角色的所有权限。 在调试时,在razor视图中,我可以确认模型中的新值true或false是正确的。问题是,复选框显示了角色更改前的旧值。。 这是我第一个被问到的问题,所以如果这个问题没有得到最好的解决,我将不得不道歉。 提前向各位发送thx:

这是我的控制器:

       public ActionResult Index(int ? SelectedRoleId)
    {

        ManagePermissionsViewModel model = new ManagePermissionsViewModel();

        if (SelectedRoleId == null)
        {
            model.SelectedRoleID = 1; // value 1 is the supervisor Role
        }
        else
        {
            model.SelectedRoleID = SelectedRoleId;
        }
        //values for the dropdownlist of Roles 
        var items = from x in db.UserRoles
                    select x;
        model.RoleList = new SelectList(items, "Id", "DESCRIPTION");

        //gets all the permissions of the selected role 
        model.EntirePermissionList = (from k in db.Permissions
                                      select new Permission
                                      {
                                          IdPermission = k.Id,
                                          PermissionDescription = k.Description,
                                          IsSet = db.RolePermissions.Any(n => n.RoleId == model.SelectedRoleID && n.PermissionId == k.Id),
                                          PermissionGroupId = (int)k.PermissionGroupId
                                      }).ToList();
        //Gets all the groups of Permissions
        model.ListPermissionGroups = (from l in db.PermissionGroups
                                      select new PermissionGroup
                                      {
                                          Id = l.Id,
                                          Description = l.Description
                                      }).ToList();
         return View(model);
    }
             [HttpPost]
    public ActionResult Index(FormCollection form) {

        switch (form["SubmitButton"])
        {
            case "Save":
                SavePermissions();
                break;
            default:
                return RedirectToAction("Index", new RouteValueDictionary(new { controller = "ManagePermissions", action = "Index", SelectedRoleId = Convert.ToInt32(form["SelectedRoleId"]) }));
           }

        return View();

    }
        public async Task<ActionResult> Index(int? SelectedRoleId)
    {
        if (SelectedRoleId == null)
        {
            SelectedRoleId = 1;
        }

        var model = await GetSelectedPermissions(SelectedRoleId);
        return this.View("Index",model);

    }


    [HttpGet]
    public async Task<ActionResult> GetPermissions(string Id)
    {


        var SelectedRoleId = int.Parse(Id);
        var model = await this.GetSelectedPermissions(SelectedRoleId);
        return PartialView("_ManagePermissions", model);
    }

    private async Task<ManagePermissionsViewModel> GetSelectedPermissions(int? SelectedRoleId)  
    {

        ModelState.Clear();
        ManagePermissionsViewModel model = new ManagePermissionsViewModel();
        model.SelectedRoleID = SelectedRoleId;

        var items = from x in db.UserRoles
                    select x;
        model.RoleList = new SelectList(items, "Id", "DESCRIPTION");

        model.EntirePermissionList = await (from k in db.Permissions
                                      select new Permission
                                      {
                                          IdPermission = k.Id,
                                          PermissionDescription = k.Description,
                                          IsSet = db.RolePermissions.Any(n => n.RoleId == model.SelectedRoleID && n.PermissionId == k.Id),
                                          PermissionGroupId = (int)k.PermissionGroupId
                                      }).ToListAsync();

        model.ListPermissionGroups = await (from l in db.PermissionGroups
                                      select new PermissionGroup
                                      {
                                          Id = l.Id,
                                          Description = l.Description
                                      }).ToListAsync();

        return model;
    }
以下是我的观点:

    '@model AML.Web.Models.ManagePermissionsViewModel
     @using (Html.BeginForm("Index", "ManagePermissions", FormMethod.Post, new { id = "MyForm" }))
  {

@Html.Label("Role :", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownList("RoleId", Model.RoleList, new { id = "RoleId" })

<div>

    @foreach (var item in Model.ListPermissionGroups)
    {
        <h3> @item.Description</h3>

       foreach (var permission in Model.EntirePermissionList.Where(n => n.PermissionGroupId == item.Id))
        {

            <h5>
                @permission.PermissionDescription
                @Html.CheckBox("Chk_Permisssion", permission.IsSet)

            </h5>

        }
    }

</div>
<input type="submit" value="Save" name="SubmitButton" class="btn btn-default" />
    }
  @section Scripts {
<script type="text/JavaScript">
    $(document).ready(function () {

        $("#RoleId").change(function (e) {
            e.preventDefault();
            $.ajax({
                url: "/ManagePermissions/Index",
                cache: false,
                type: "POST",
                data: { 'SelectedRoleId': $(this).val() },
                dataType: "json",
                success: function (result) { console.log("Sucess!"); },
                error: function (error) { console.log("Error!"); }
            })
        });
    });

</script>
现在,每次Drop更改值时,复选框中的权限都会更新。我让它使用drop上的属性,即change=Document.location.hef=URL。这是一个好方法吗?或者我应该使用ajax请求之类的东西

更新2

控制员:

       public ActionResult Index(int ? SelectedRoleId)
    {

        ManagePermissionsViewModel model = new ManagePermissionsViewModel();

        if (SelectedRoleId == null)
        {
            model.SelectedRoleID = 1; // value 1 is the supervisor Role
        }
        else
        {
            model.SelectedRoleID = SelectedRoleId;
        }
        //values for the dropdownlist of Roles 
        var items = from x in db.UserRoles
                    select x;
        model.RoleList = new SelectList(items, "Id", "DESCRIPTION");

        //gets all the permissions of the selected role 
        model.EntirePermissionList = (from k in db.Permissions
                                      select new Permission
                                      {
                                          IdPermission = k.Id,
                                          PermissionDescription = k.Description,
                                          IsSet = db.RolePermissions.Any(n => n.RoleId == model.SelectedRoleID && n.PermissionId == k.Id),
                                          PermissionGroupId = (int)k.PermissionGroupId
                                      }).ToList();
        //Gets all the groups of Permissions
        model.ListPermissionGroups = (from l in db.PermissionGroups
                                      select new PermissionGroup
                                      {
                                          Id = l.Id,
                                          Description = l.Description
                                      }).ToList();
         return View(model);
    }
             [HttpPost]
    public ActionResult Index(FormCollection form) {

        switch (form["SubmitButton"])
        {
            case "Save":
                SavePermissions();
                break;
            default:
                return RedirectToAction("Index", new RouteValueDictionary(new { controller = "ManagePermissions", action = "Index", SelectedRoleId = Convert.ToInt32(form["SelectedRoleId"]) }));
           }

        return View();

    }
        public async Task<ActionResult> Index(int? SelectedRoleId)
    {
        if (SelectedRoleId == null)
        {
            SelectedRoleId = 1;
        }

        var model = await GetSelectedPermissions(SelectedRoleId);
        return this.View("Index",model);

    }


    [HttpGet]
    public async Task<ActionResult> GetPermissions(string Id)
    {


        var SelectedRoleId = int.Parse(Id);
        var model = await this.GetSelectedPermissions(SelectedRoleId);
        return PartialView("_ManagePermissions", model);
    }

    private async Task<ManagePermissionsViewModel> GetSelectedPermissions(int? SelectedRoleId)  
    {

        ModelState.Clear();
        ManagePermissionsViewModel model = new ManagePermissionsViewModel();
        model.SelectedRoleID = SelectedRoleId;

        var items = from x in db.UserRoles
                    select x;
        model.RoleList = new SelectList(items, "Id", "DESCRIPTION");

        model.EntirePermissionList = await (from k in db.Permissions
                                      select new Permission
                                      {
                                          IdPermission = k.Id,
                                          PermissionDescription = k.Description,
                                          IsSet = db.RolePermissions.Any(n => n.RoleId == model.SelectedRoleID && n.PermissionId == k.Id),
                                          PermissionGroupId = (int)k.PermissionGroupId
                                      }).ToListAsync();

        model.ListPermissionGroups = await (from l in db.PermissionGroups
                                      select new PermissionGroup
                                      {
                                          Id = l.Id,
                                          Description = l.Description
                                      }).ToListAsync();

        return model;
    }
景色

     <h2>Permissions - Ajax with Partial View</h2>
     @using (Html.BeginForm("SaveData", "ManagePermissions", FormMethod.Post, new { id = "MyForm" }))
    {

@Html.Label("Role :", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownListFor(n => n.SelectedRoleID, Model.RoleList, null, null)
<div id="target">
    @Html.Partial("~/Views/Shared/_ManagePermissions.cshtml", Model)
</div>
<input type="submit" value="Save" name="SubmitButton" class="btn btn-default" />
      }
      @section Scripts {

<script type="text/javascript">
    $(document).ready(function () {
        $("#SelectedRoleID").change(function () {
            var SelectedRoleID = $("#SelectedRoleID").val();
            $("#target").load('@(Url.Action("GetPermissions","ManagePermissions",null, Request.Url.Scheme))?Id=' + SelectedRoleID);
        });
    });
</script>

           }
部分观点:

    <div>

@foreach (var item in Model.ListPermissionGroups)
{
    <h3> @item.Description</h3>
    foreach (var permission in Model.EntirePermissionList.Where(n => n.PermissionGroupId == item.Id))
    {
        <h5>
            @permission.PermissionDescription
            <input type="checkbox" id="@permission.IdPermission" checked="@permission.IsSet">
        </h5>

    }
}
    </div>

您可以使用ajax调用posts to Index方法—它不会更新DOM—您在success函数中唯一要做的就是console.logsuces!。不清楚您到底想做什么,但我怀疑您需要调用一个方法,该方法使用新的复选框返回部分视图并更新DOM,或者最好只返回包含您想要设置的权限的JSON并使用jquery更新DOM。我明白了,我希望可以重用控制器中的索引函数,以返回用户选择的新角色的权限。ajax请求是发布所选值的方法,然后我将重定向到Index操作,这样它就可以获得所需的记录。再次返回视图…如果没有部分视图,如何实现这一点,您能帮助我吗?Ajax调用保持在同一页面上,不会重定向。使用location.hef=URL有点违背了使用ajax的目的,您还可以在控制器中执行标准的提交和重定向。如果使用ajax,通常会返回部分视图或Json,然后根据返回的内容在成功函数中仅更新部分DOM,以避免重定向。Thx Stephen,我将尝试返回Json方法,因为我不想在这里使用部分视图。Stephen,可以在我的帖子中查看更新2吗?正如您所指出的,我最终使用了部分视图。您能确认异步使用是否正确吗?一切如期而至,谢谢您一路帮助我:
    <div>

@foreach (var item in Model.ListPermissionGroups)
{
    <h3> @item.Description</h3>
    foreach (var permission in Model.EntirePermissionList.Where(n => n.PermissionGroupId == item.Id))
    {
        <h5>
            @permission.PermissionDescription
            <input type="checkbox" id="@permission.IdPermission" checked="@permission.IsSet">
        </h5>

    }
}
    </div>