2015-07-02 5 views
2

У меня есть представление, в котором он просматривает модель и отображает детали в редактируемом режиме. Одним из значения модели от списка выбора, как показано нижеКак установить значение по умолчанию для выбора списка в MVC во время выполнения

@if (Model != null) 
    { 
    for (int i = 0; i < Model.provider_service_dtls.Count; i++) 
    { 
    <tr> 
    <td> @Html.DropDownListFor(m => m.provider_service_dtls[i].activity_code_type, 
(SelectList)@ViewBag.activity_code_type, "--- Select Activity Code Type ---", new { @class = "m-wrap" })</td> 
    <td>@Html.TextBoxFor(m => m.provider_service_dtls[i].activity_name)</td>  
    </tr> 

    } 
    } 

Здесь ViewBag.activity_code_type содержат значения Internal & Standard при подаче, если пользователь выбрал Internal его значение 1 переходит к контроллеру и если Standard будет 2 и здесь по умолчанию значение будет "--- Select Activity Code Type ---"

enter image description here

Теперь, когда я открываю тот же запрос в режиме редактирования, если значение модели для provider_service_dtls[i].activity_code_type является 1 выбор списка должен быть выбран по умолчанию как Internal и Standard, если это 2.

Я закодированы как этот

@Html.DropDownListFor(m => m.provider_service_dtls[i].activity_code_type, 
(SelectList)@ViewBag.activity_code_type, Model.provider_service_dtls[i].activity_code_type) 

Но это не работает, как ожидается, он дает результат, как показано на рисунке ниже

enter image description here

Здесь должен по умолчанию выбран Internal. Каковы изменения, которые необходимо достичь?

Edited

Модель

public partial class provider_service_dtls 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public long service_id { get; set; } 

     public long preapproval_id { get; set; } 

     public string activity_code_type { get; set; } 
     public string activity_type { get; set; } 

     public string activity_type_name { get; set; } 


     public string activity_code { get; set; } 
     public string activity_name { get; set; } 
     public string internal_activity_code { get; set; } 
     public string internal_activity_name { get; set; } 


     [ForeignKey("preapproval_id"), InverseProperty("provider_service_dtls")] 
     public virtual provider_preapproval preapproval { get; set; } 


    } 

шаблон Редактор

@model Provider.Models.provider_preapproval 
@Html.DropDownListFor(m => m.activity_code_type, (SelectList)ViewData["options"]) 

Посмотреть

Внутри цикл я закодированы как этот

@Html.EditorFor(m => m.provider_service_dtls, 
new { options = (SelectList)@ViewBag.activity_code_type }) 

Я получаю сообщение об ошибке

«System.Web.Mvc.HtmlHelper» делает не содержит определения для «EditorFor», а лучший метод расширения перегрузки 'System.Web.Mvc.Html.EditorExtensions.EditorFor (System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>, строка, объект)' имеет некоторые недопустимые аргументы

ответ

2

К сожалению, @Html.DropDownListFor() ведет себя немного иначе, чем другие помощники при рендеринге элементов управления в цикле. Об этом ранее сообщалось как о проблеме на CodePlex (не уверен, что ее ошибка или просто ограничение)

Создайте пользовательскую форму EditorTemplate для типа в коллекции.

В /Views/Shared/EditorTemplates/provider_service_dtls.cshtml (обратите внимание на имя должно совпадать с именем типа)

@model yourAssembly.provider_service_dtls 

@Html.HiddenFor(m => m.service_id) 
@Html.DropDownListFor(m => m.activity_code_type, (SelectList)ViewData["options"], "--- Select Activity Code Type ---") 
.... // html helpers for other properties of provider_service_dtls 

, а затем в главном окне, передать SelectList к EditorTemplate, как additionalViewData

@model yourAssembly.provider_preapproval 

@using (Html.BeginForm()) 
{ 
    .... // html helpers for other properties of provider_preapproval 

    @Html.EditorFor(m => m.provider_service_dtls, new { options = (SelectList)@ViewBag.activity_code_type }) 
    ... 

В EditorFor() методы принимает IEnumerable<T> и будет генерировать элементы управления для каждого элемента в коллекции

Edit

Альтернативой является создание нового SelectList в каждой итерации цикла for, где вам нужно установить Selected свойство SelectList. Это означает, что ViewBag свойство должно быть IEnumerable<T>, не SelectList, например, в контроллере

ViewBag.ActivityCodeTypeList = new[] 
{ 
    new { ID = 1, Name = "Internal" }, 
    new { ID = 2, Name = "Standard" } 
} 

и в представлении

for (int i = 0; i < Model.provider_service_dtls.Count; i++) 
{ 
    @Html.DropDownListFor(m => m => m.provider_service_dtls[i].activity_code_type, 
    new SelectList(ViewBag.ActivityCodeTypeList, "ID", "Name", Model.provider_service_dtls[i].activity_code_type), 
    "--- Select Activity Code Type ---") 
} 
+0

, поэтому я не могу использовать это внутри forloop? – Sachu

+0

Ну есть еще один вариант, но это означает, что вам нужно построить новый 'SelectList' на каждой итерации (не очень эффективный). Его также единственный способ, которым это будет работать, если вы будете использовать 'ListBoxFor()', поэтому я предлагаю вам использовать «EditorTemplate», который является гораздо лучшим подходом. Не говоря уже о том, что теперь у вас есть многоразовый элемент управления, поэтому где-нибудь еще в вашем приложении вам нужно создавать элементы управления для типа, вы можете просто использовать '@ Html.EditorFor()' –

+0

Также ваше использование '@ Html.DropDownListFor()' в последнем фрагменте кода неверно. Третий параметр предназначен для генерации 'optionLabel' (т.е.' '--- Select Activity Code Type ---" ', который вы использовали ранее), поэтому ваше второе изображение показывает' '1" 'как первый вариант –

0

Просто вы можете попробовать это с помощью списка IEnumerable типа модели, как

@Html.DropDownList("ReceiverID", (IEnumerable<SelectListItem>)(m => m.activity_code_type), "--- Select ---", new { @class ="form-control" }) 

Надеется, что он будет работать