2013-10-11 9 views
1

Я чувствую, что ответ на этот вопрос должен быть там в нескольких местах, поскольку варианты этого вопроса, похоже, очень часто задаются. К сожалению, я не могу понять, как сделать то, что я пытаюсь достичь, поэтому ваша помощь очень ценится еще раз.Динамическое выбранное значение по умолчанию для MVC DropDownList

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

Когда создается новая группа, нулевое значение по умолчанию является прекрасным, но когда я просто обновляю существующую запись, я хочу, чтобы выпадающее меню было по умолчанию для опции с соответствующим идентификатором сотрудника.

Так что запрос доступен сотрудников:

var rtrnStaff = (from st in db.PrmTbl_Staffs 
    join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID 
    where st.Active == true 
    select new { st.ID, Name = sal.Desc + ". " + st.Name }); 

Чтобы вставить пустое значение в этом массиве:

List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList(); 
staff.Insert(0, (new SelectListItem { Text = "None", Value = "0" })); //can value be = null? 

На мой взгляд, для формы, чтобы создать новую группу пользователей, я может предоставить выпадающее меню так:

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"]) 

Это обеспечивает выпадающее меню с опцией «Нет», Это хорошо. Однако, когда я пытаюсь то же самое для моей формы обновления, с добавлением значения по умолчанию аргумента, он не работает:

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], item.StaffID) 

Намерения в том, что при помещении в пределах цикла Еогеаспа, возможность сопоставления соответствующий идентификатор персонала будет отображаться как дефолт. Вместо этого «никто» по-прежнему остается первым.

я пытаюсь просто запросить таблицу в мой контроллер, не построить SelectList там, но передать результаты непосредственно через ViewData к View, а затем в представлении сделать следующее:

@Html.DropDownList("staffID", new SelectList(
    (System.Collections.IEnumerable) ViewData["Staff"], "ID", "Name", item.StaffID), 
    new { Name = "staffID" }) 

Это не работает, но без опции «none». Ясно, что мне нужна какая-то средняя почва! Между DropDownList, DropDownListFor, List, SelectList и т. Д., Я смущен.

EDIT
(Для того, чтобы показать текущее состояние кода)
Контроллер:

var rtrnStaff = (from st in db.PrmTbl_Staffs 
    join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID 
    where st.Active == true 
    select new { st.ID, Name = sal.Desc + ". " + st.Name }); 

    List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList(); 
    ViewData["StaffwNull"] = staff; 

Вид:

//show dropdown of all staff, 
//defaulting to "None" value (works) 
@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None") 

//show dropdown of all staff, 
//defaulting to value matching item.staffID (doesn't work) 
//default selection is first list item 
//and list doesnt include "None" option 
@foreach (var item in Model) 
    { 
     ... 
     var thisStaffID = item.StaffID; 
     .... 
     @Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], thisStaffID) 
    } 

ответ

0

Там нет перегрузки, где вы можете указать выбранное значение. MVC выполняет поиск в объекте ViewBag для элемента с именем staffID и использует его как выбранное значение. Вы можете использовать this overload метода DropDownList, который позволяет указать метку опции:

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None") 

Это делает дополнительный параметр в списке выбора в верхней части, так что вам не придется делать это вручную.

Сторона примечания: вы должны изучить привязку модели MVC.

+0

Если я не могу указать выбранное значение, то это не имеет смысла для меня для моей формы редактирования, в результате чего уже существующие значения (соответствие 'item.staffID') является выбранным значением по умолчанию. Используя вашу линию, это не работает - все списки по умолчанию имеют первое значение. – Eamonn

+0

@Eamonn он должен получить выбранное значение из 'staffID'. –

+0

Извините, Хенк, я, очевидно, ошибаюсь - я обновил вопрос, чтобы показать текущее состояние кода, но списки по-прежнему не соответствуют их первому значению – Eamonn

0

Вы можете указать ID в раскрывающемся списке (this overload), а затем использовать jQuery для его обновления.

Посмотреть

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], new { id = "dropdown1" }) 

JQuery

<script> 
    $(document).ready(function() { 
     $('#dropdown1').val('theValueYouWantSelected'); 
    }); 
</script> 
Смежные вопросы