Asp.net mvc 4 ASP.Net MVC-更改dropdownlist后无法设置@Html.Checkbox的值
我到处找类似的东西,什么也找不到。。 我正在使用ASP.NETMVC4。我正在构建一个页面,以便我的应用程序中的用户可以管理与每个角色关联的权限。 因此,我有一个@htmlDropDownList视图来显示所有可用的角色,下面是一个@Html.CheckBox,用于上面选择的角色的每个权限 第一次呈现视图时,根据该角色的权限,所有复选框都设置为true或false。一切正常,生活愉快:。当drop的值更改时,我使用$.ajax发布SelectedRoleId。然后,获取新选定角色的所有权限。 在调试时,在razor视图中,我可以确认模型中的新值true或false是正确的。问题是,复选框显示了角色更改前的旧值。。 这是我第一个被问到的问题,所以如果这个问题没有得到最好的解决,我将不得不道歉。 提前向各位发送thx: 这是我的控制器: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。然后,获取新选定角色的所有权限。 在
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>