2015-06-22 5 views
0

У меня есть статический список выбора, как показано нижеПрисвоить SelectList динамически создается выпадающий список в MVC

var listItems = new SelectListItem[] { 
       new SelectListItem(){Text="-- Please Select --",Value=""}, 
       new SelectListItem(){Text="Death",Value="Death"}, 
       new SelectListItem(){Text="Resignation",Value="Resignation"}, 
       new SelectListItem(){Text="Retirement",Value="Retirement"}, 
       new SelectListItem(){Text="Termination",Value="Termination"}, 
       new SelectListItem(){Text="Transfer",Value="Transfer"}, 
      }; 

      ViewBag.DeletionReason = listItems; 

и назначая то же самое ViewBag.

Теперь на моей странице мне нужно найти идентификатор персонала.

например: 1234

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

Я сделал это, как показано ниже

Контроллер

public ActionResult DeleteRequest(string[] memberIDs,string[] 
deletion_reason, string[] effective_date) 
    { 
    foreach (string item in memberIDs) 
{ 

    np_user_requests_dtls userRequest = new np_user_requests_dtls(); 
    staffid = memberIDs[i]; 
    effectiveDateValue = effective_date[i]; 
    userRequest.staffid_id = staffid; 
    userRequest.deletion_reason = deletion_reason[i]; 
userRequest.effective_date = Convert.ToDateTime(effectiveDateValue); 

try 
{ 
    db.SaveChanges(); 

} 
    catch (exception ex) 
         { 

         } 
        } 

        i++; 
       } 

      } 

Посмотреть

<table > 
<thead> 
<tr> 
<th> 
Staff ID 
<th> 
New Effective End Date 
</th> 
<th> 
Deletion Reason 
</th> 
<th> 
<input type="checkbox" name="checkAll" id="checkAll" value="1" style="width: 25px" /> 
<a href="javascript:void(0);" id="selectAllInResult"> Or Select all in result</a> 
<span id="span_effective_for_all" style="display:none"> 
<input type="text" name="effective_date_all" id="effective_date_all" value="" placeholder="Effective End Date All" class="datepicker" style="width: 150px" >&nbsp;<input type="button" name="cancelAll" id="cancelAll" value="Cancel" style="width: 60px" /> 
</span> 
<span id="span_deletion_reason_all" style="display:none"> 
<select name="deletion_reason_all" id="deletion_reason_all" style="width: 150px">&nbsp;</select><input type="button" name="cancelAll" id="cancelAll" value="Cancel" style="width: 60px" /> 
</span> 
</th> 
</tr> 
</thead> 
<tbody> 
@if (Model != null && Model.Count() > 0) 
{ 
foreach (var item in Model) 
{ 
<tr> 
<td> 
@Html.DisplayFor(modelItem => item.staff_id) 
</td> 
<td> 
<input type="text" name="effective_date[]" id="@("efddate_"[email protected]_id)" value="" placeholder="Effective End Date" class="datepicker"></td> 
<td> 
@Html.DropDownList("deletion_reason[]",(SelectList)@ViewBag.DeletionReason) 
</td> 
<td> 
<input type="checkbox" name="memberIds[]" id="@item.staff_id" value="@item.staff_id_id" /> 
</td> 
</tr> 
} 
</tbody> 
</table> 

Модель

public string staff_id { get; set; } 
public date effective_date { get; set; } 
public string deletion_reason { get; set; } 

В случае, если имя_идентификации также совпадает с типом текста, например, effective_date, я могу опубликовать данные. Но мне нужно, чтобы он был выпадающим. Я stucked там

Это дает мне время выполнения ошибки

There is no ViewData item of type 'IEnumerable<SelectListItem>' 
that has the key 'deletion_reason[]'. 

Также, пожалуйста, дать представление о том, как я могу получить значение, соответствующее каждому персоналу при размещении.

+0

'DropDownListFor()' принимает выражение как первый аргумент (а не 'string'). Затем вы не можете назвать свойство, которое вы связываете с тем же свойством, что и свойство модели. Его немного сложно понять, что вы пытаетесь сделать здесь. Каков метод, на который вы будете отправлять сообщения? –

+0

@stephenmuecke Я немного запутался здесь..и отредактировал мой вопрос с другими динамическими данными..что это текст .. в том, что они выберет дату .. контроллер сможет получить эти динамические даты с именем массива .. но здесь мне нужно показать выпадающее меню, которое там было. Я изменил на 'DropDownList()' – Sachu

+0

Если вы хотите передать строку, используйте '@ Html.DropDownList (" deletion_reason [] ", ...)' - (не '@ Html.DropDownListFor()', но его сложный чтобы увидеть, как вы отправляете назад что-либо значимое с этим. –

ответ

1

Во-первых, вы можете упростить создание SelectList для

ViewBag.DeletionReason = new SelectList(new List<string>() { "Death", "Resignation", "Retirement", "Termination", "Transfer" }); 

Примечание: Не включайте опцию "--Выберите--". Используйте перегрузку DropDownListFor(), которая принимает optionLabel (см. Ниже).

Предполагая, что модель называется Staff то вид должен быть

@model List<yourAssembly.Staff> 
..... 
for(int i = 0; i < Model.Count; i++) 
{ 
    @Html.HiddenFor(m => m[i].staff_id) 
    @Html.DisplayForFor(m => m[i].staff_id) 
    @Html.TextBoxFor(m => m[i].effective_date, new { @class="datepicker" }) 
    @Html.DropDownListFor(m => m[i].deletion_reason, (SelectList)ViewBag.DeletionReason, "-- Please Select --") 
} 

и вы POST метод должен быть

[HttpPost] 
public ActionResult YourActionName(List<Staff> model) 
{ 
} 

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

Сторона примечания: Ошибка, которую вы опубликовали в своем изменении, вызвана значением ViewBag.DeletionReason, являющимся null.Возможно, потому, что вы возвращаете представление в методе POST, но не переназначили значение ViewBag.DeletionReason?

1

Хотя это довольно хаки, я думаю, что вы пытаетесь сделать свой массив selectlistitem как перечислимый, а затем использовать его?

@Html.DropDownList("deletion_reason", ((SelectListItem[])@ViewBag.DeletionReason).ToList()) 
+0

Re: Значение не может быть нулевым - похоже, что ваш ViewBag.DeletionReason не находится в этом контроллере, убедитесь, что он у вас в контроллере и повторите попытку – Pabregez

+0

ваш ответ также помог мне ... но выше одного совершенного ... за вашу помощь. – Sachu

 Смежные вопросы

  • Нет связанных вопросов^_^