Сохранение неизвестного количества идентичных выпадающих в представлении Razor - PullRequest
1 голос
/ 04 августа 2011

Я следовал руководству Стива Сандерсона «Редактирование списка переменной длины, ASP.NET MVC 2-style» и создал представление MVC для редактирования списка элементов. Обратите внимание, я использую MVC 3, поэтому я не уверен, есть ли лучший способ сделать это. http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

Проблема, которую я имею, состоит в том, что одно из полей в моем списке - это выпадающий список. Мне удалось получить раскрывающийся список в каждой строке, но он не загружает выбранное значение при загрузке страницы. Тем не менее, он сохраняет выбранное значение, но каждый раз, когда я редактирую страницу, мне нужно переустанавливать все выпадающие списки.

Кто-нибудь знает, как установить выбранное значение раскрывающегося списка для каждой "строки" в частичном представлении?

Мой вид редактирования имеет

@foreach (var item in Model.Roles)
{
    @Html.Partial("RoleRow-Edit", item)
}

Мой частичный вид имеет

@using (Html.BeginCollectionItem("Roles"))
{
    @Html.EditorFor(model => model.TemplateID)
    @Html.DropDownList("PartyRoleID", (SelectList)ViewBag.PartyRoles)
    @Html.EditorFor(model => model.DisplayName)
}

На моем контроллере у меня есть

ViewBag.PartyRoles = new SelectList(db.PartyRoles.OrderBy(c => c.Role), "Role", "Role");

Ответы [ 2 ]

0 голосов
/ 22 августа 2011

Я нашел обходной путь: вы должны создать SelectList в частичном представлении и установить его начальное значение в ограниченное значение, поэтому частичное представление будет выглядеть так:

@{var selectList = new SelectList(db.PartyRoles.OrderBy(c => c.Role), 
                                 "Role", "Role",Model.PartyRoleID);} 
/*pass the db.PartyRoles.OrderBy(c => c.Role) in view bag inside controller,
it's cleaner*/

@using (Html.BeginCollectionItem("Roles"))
{
  @Html.EditorFor(model => model.TemplateID)
  @Html.DropDownList(model => model.PartyRoleID, selectList)
  @Html.EditorFor(model => model.DisplayName)
}
0 голосов
/ 04 августа 2011

Я не вижу нигде в вашем коде, где бы вы установили значение PartyRoleID.Я бы порекомендовал вам использовать модели представлений и строго типизированные представления вместо ViewBag:

@Html.DropDownListFor(x => x.PartyRoleID, Model.PartyRoles)

Теперь все, что вам нужно сделать на контроллере, это установить значение модели представления:

var roles = db.PartyRoles.OrderBy(c => c.Role);
var model = new MyViewModel();
// preselect the value of the dropdown
// this value must correspond to one of the values inside the roles collection
model.PartyRoleID = "admin";
model.PartyRoles = new SelectList(roles, "Role", "Role");
return View(model);

Также я бы порекомендовал вам использовать шаблоны редактора и заменить следующий цикл foreach:

@foreach (var item in Model.Roles)
{
    @Html.Partial("RoleRow-Edit", item)
}

следующим:

@Html.EditorFor(x => x.Roles)

Теперь осталось только настроитьсоответствующий шаблон редактора .

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