MVC3 Списък с квадратчета за отметка за управление на роли

Опитвам се да управлявам роли в приложение MVC3. Идеята е, че имам списък с потребители и когато щракна върху бутона Редактиране на роли в реда, получавам модален прозорец със списък на всички възможни роли с отметнати тези, на които потребителят е член.

След това мога да избера новите роли и да щракна върху запазване и да изпратя ajax публикация обратно на сървъра, за да запазя промените.

Имам изскачащ модал, но не съм сигурен как да генерирам квадратчетата за отметка по начин, който лесно да се изпрати обратно на сървъра при промяна. Искам възможно най-простото решение.

Ето какво имам за частичния изглед, с който модалът се попълва, когато щракнете върху Редактиране на роли:

public ActionResult ChooseRolePartial(string username)
    {
        var userRoles = Roles.GetRolesForUser(username);
        var list = new MultiSelectList(Roles.GetAllRoles());
        foreach (var item in list)
        {
            item.Selected = userRoles.Contains(item.Value);
        }

        var model = new ChooseRoleModel
        {
             Roles = list,
             Username = username
        };

        return PartialView("Partials/ChooseRolePartial", model);
    }

Надявах се, че има EditorFor за MultiSelectList и всичко ще бъде обработено вместо мен. Но изглежда това не е така. Просто прави текста фалшив за всяка от моите роли.

Кой е най-добрият начин да генерирате този списък с квадратчета за отметка и да изпратите отметнато заедно с потребителското име обратно на сървъра?


person Jason    schedule 25.01.2012    source източник


Отговори (1)


Модел:

public class ChooseRoleModel
{
    public SelectListItem[] Roles { get; set; }
    public string Username { get; set; }
}

Контролер:

public class RolesController : Controller
{
    ...

    public ActionResult ChooseRolePartial(string username)
    {
        var userRoles = Roles.GetRolesForUser(username);
        var roles = Roles.GetAllRoles().Select(x => new SelectListItem
        {
            Value = x,
            Text = x,
            Selected = userRoles.Contains(x)
        }).ToArray();

        var model = new ChooseRoleModel
        {
            Roles = roles,
            Username = username
        };

        return PartialView("Partials/ChooseRolePartial", model);
    }

    [HttpPost]
    public ActionResult ChooseRolePartial(ChooseRoleModel model)
    {
        ...
    }
}

Преглед:

@model ChooseRoleModel

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Username)
        @Html.EditorFor(x => x.Username)
    </div>
    for (int i = 0; i < Model.Roles.Length; i++)
    {
        @Html.CheckBoxFor(x => x.Roles[i].Selected)    
        @Html.LabelFor(x => x.Roles[i].Selected, Model.Roles[i].Text)
        @Html.HiddenFor(x => x.Roles[i].Text)
    }
    <button type="submit">OK</button>
}
person Darin Dimitrov    schedule 25.01.2012