MVC 3: Заполнение выпадающего списка пользователей в роли члена ASP «Менеджер» - PullRequest
1 голос
/ 13 октября 2011

Итак, я внедряю ASP Членство и управление ролями в моем приложении.У меня также есть вторая таблица пользователей со всей информацией, не связанной с членством.Я установил E-mail как имя пользователя в Membership и как внешний ключ в моей таблице User.

Я настраиваю страницу регистрации, чтобы включить раскрывающийся список, чтобы при создании учетной записи можно было выбрать менеджера.Список менеджеров создается путем нахождения всех пользователей Членства с ролью «Менеджер», а затем создания коллекции пользователей, где внешние ключи соответствуют результатам.

List<string> managerNames = new List<string>(Roles.GetUsersInRole("Manager"));
var managers = from m in _db.Users where managerNames.Contains(m.Email) select m;
ViewBag.managers = managers;

Теперь я должен использовать эту коллекцию пользователей, чтобызаполнить раскрывающийся список в моем представлении, в котором для атрибута «Имя» установлено значение «ManagerID» (в соответствии с моей RegistrationModel), значение каждого параметра установлено на первичный ключ пользователя, а отображаемый текст в раскрывающемся списке показывает DisplayName пользователя.модель.

Я могу выполнить утомительную задачу: перебрать мою коллекцию "менеджеров" и заполнить отдельный SelectListItem, затем передать SelectListItem в @Html.DropDown("ManagerID", newSelectListItem), но это кажется чрезмерным.Есть ли более прямой (или приемлемый) способ сделать это?

РЕДАКТИРОВАТЬ

Я добавил это в свой контроллер

    var selectList = new List<SelectListItem>();
    foreach (var manager in managers)
        {
            selectList.Add(new SelectListItem(){
                Value = manager.UserID.ToString(),
                Text = manager.DisplayName,
                Selected = false
            });
        }
        ViewBag.managers = selectList;

и этона мой взгляд

@Html.DropDownList("ManagerID", (List<SelectListItem>)ViewBag.managers)

и все работает.Это все еще лучший подход?

1 Ответ

4 голосов
/ 13 октября 2011

Это все еще лучший подход?

Нет.Наилучший подход - использовать модели представлений и забыть о существовании ViewBag / ViewData.Итак, начните с разработки модели представления, которая будет отвечать требованиям вашего представления (отобразите ddl менеджеров):

public class MyViewModel
{
    [Required]
    public int? SelectedManagerId { get; set; }
    public IEnumerable<SelectListItem> Managers { get; set; }
}

, а затем действие вашего контроллера заполнит эту модель представления и передаст ее представлению:

public ActionResult Foo()
{        
    var managers = ... query your repository to get them
    var model = new MyViewModel
    {
        Managers = managers.Select(x => new SelectListItem
        {
            Value = x.UserID.ToString(),
            Text = x.DisplayName
        })
    };
    return View(model);
}

и, наконец, в вашем строго типизированном представлении:

@model MyViewModel
...
@Html.DropDownListFor(
    x => x.SelectedManagerId, 
    Model.Managers, 
    "-- Select a manager --"
)

Таким образом, каждый раз, когда вы используете ViewBag / ViewData в приложениях ASP.NET MVC, должен звучать сигнал тревоги, сообщающий, что есть лучшийспособ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...