Wiązanie do kolekcji Checkbox
Usiłuję zaimplementować ekran uprawnień, w którym użytkownik może uzyskać określone zezwolenie na konkretnym ekranie. W tym celu generuję kolekcję Checkboxfor, związaną z kolekcją właściwości bool. Ale kiedy przesyłam formularz, albo uzyskuję wszystkie właściwości bool, albo wszystkie fałszywe, w zależności od tego, czy zainicjowałem te właściwości jako true lub false w konstruktorze viewmodel.
Oto kod dla ViewModel:
Podejście I:
public class MyViewModel
{
public MyModel Model { get; set; }
public IEnumerable<ScreenType> Screens { get; set; }
public IEnumerable<SecurityType> SecurityTypes { get; set; }
public List<PermissionType> Permissions { get; set; }
public MyViewModel()
{
LoadScreens();
LoadSecurityTypes();
LoadPermissions();
}
public void LoadPermissions()
{
Permissions = new List<PermissionType>();
foreach (var screen in Screens)
{
foreach (var securityType in SecurityTypes)
{
Permissions.Add(
new PermissionType
{
PermissionId= Guid.NewGuid(),
ScreenId= screen.Id,
SecurityId = securityType.Id,
IsAllowed = false
});
}
}
}
}
Podejście II
public class MyViewModel
{
public MyModel Model { get; set; }
public IEnumerable<ScreenType> Screens { get; set; }
public IEnumerable<SecurityType> SecurityTypes { get; set; }
public List<bool> AllowedList { get; set; }
public MyViewModel()
{
LoadScreens();
LoadSecurityTypes();
LoadPermissions();
}
public void LoadPermissions()
{
AllowedList = new List<bool>();
foreach (var form in Forms)
{
foreach (var security in Securities)
{
AllowedList.Add(false);
}
}
}
}
Oto kod mojego widoku:
Podejście I:
@using (Ajax.BeginForm("Create", "Role", null, new AjaxOptions { UpdateTargetId = "addStatus", InsertionMode = InsertionMode.Replace, OnSuccess = "onFormPostSuccess" }, new { @id = "AddForm" }))
{
<div>
<span><label>Screen</label></span>
@foreach (var security in Model.SecurityTypes)
{
<span><label>@security.Name</label></span>
}
<br />
@foreach (var screen in Model.Screens)
{
<span>@screen.Name</span>
foreach (var security in Model.SecurityTypes)
{
<span>@Html.CheckBoxFor(m => m.Permissions.Where(s => s.SecurityId == security.Id && s.ScreenId == screen.Id).Single().IsAllowed, new { @id = HtmlHelper.GenerateIdFromName("Create" + screen.Name + security.Name) })</span>
}
<br />
}
</div>
<div>
<span>
<input type="image" src="/content/images/submit_button.png" value="submit" />
</span>
</div>
<div>
<span id="addStatus" class="submitStatus"></span>
</div>
}
Podejście II:
@using (Ajax.BeginForm("Create", "Role", null, new AjaxOptions { UpdateTargetId = "addStatus", InsertionMode = InsertionMode.Replace, OnSuccess = "onFormPostSuccess" }, new { @id = "AddForm" }))
{
<div>
<span><label>Screen</label></span>
@foreach (var security in Model.SecurityTypes)
{
<span><label>@security.Name</label></span>
}
<br />
@foreach (int i=0; i < Model.Screens.Count(); i++)
{
<span>@Model.Screens.ElementAt(i).Name</span>
foreach (int j=0; j<Model.SecurityTypes.Count(); j++)
{
@* The index 5*i+j is because I have 5 security types *@
<span>@Html.CheckBoxFor(Model.AllowedList[5*i+j], new { @id = HtmlHelper.GenerateIdFromName("Create" + @Model.Screens.ElementAt(i).Name + @Model.SecurityTypes.ElementAt(j).Name) })</span>
}
<br />
}
</div>
<div>
<span>
<input type="image" src="/content/images/submit_button.png" value="submit" />
</span>
</div>
<div>
<span id="addStatus" class="submitStatus"></span>
</div>
}
Oto kod metody tworzenia działania w kontrolerze:
[Authorize]
[HttpPost]
public JsonResult Create(MyViewModel viewModel)
{
if ( ModelState.IsValid)
{
if (service.AddRole(viewModel))
{
return Json("Role Added !");
}
return Json("Role exists !");
}
return Json("Please correct errors");
}
Gdy sprawdzam viewModel w metodzie Create action, wszystkie właściwości IsAllowed są fałszywe. Jak zostały zainicjowane w konstruktorze modelu widoku. Nie ma efektu sprawdzania / odznaczania pól wyboru w widoku.
Czy czegoś mi brakuje?