Список флажков 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);
    }

Я надеялся, что для MultiSelectList есть EditorFor, и все это будет обработано за меня. Но, похоже, это не так. Это просто делает текст ложным для каждой из моих ролей.

Как лучше всего создать этот список флажков и отправить его вместе с именем пользователя обратно на сервер?


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