Как установить значение по умолчанию для выбора списка в 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 ---"

введите здесь описание изображения

Теперь, когда я открываю тот же запрос в режиме редактирования, если значение модели для 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)

Но он не работает должным образом, он дает результат, как показано на рисунке ниже.

введите здесь описание изображения

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

Отредактировано

Модель

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"])

Просмотреть

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

  @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>, строка, объект)» имеет недопустимые аргументы


person Sachu    schedule 02.07.2015    source источник


Ответы (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> и генерируют элементы управления для каждого элемента в коллекции.

Изменить

Альтернативой является создание нового 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 ---")
}
person Community    schedule 02.07.2015
comment
поэтому я не могу использовать это внутри forloop? - person Sachu; 02.07.2015
comment
Ну есть и другой вариант, но это означает, что вам нужно строить новый SelectList на каждой итерации (не очень эффективно). Это также единственный способ, которым это будет работать, если вы будете использовать ListBoxFor(), поэтому я предлагаю вам использовать EditorTemplate, который является гораздо лучшим подходом. Не говоря уже о том, что теперь у вас есть повторно используемый элемент управления, поэтому в любом другом месте вашего приложения, где вам нужно создать элементы управления для этого типа, вы можете просто использовать @Html.EditorFor() - person ; 02.07.2015
comment
Также вы неправильно используете @Html.DropDownListFor() в последнем фрагменте кода. Третий параметр предназначен для создания optionLabel (то есть "--- Select Activity Code Type ---", который вы использовали ранее), поэтому ваше второе изображение показывает "1" в качестве первого варианта. - person ; 02.07.2015
comment
Я смущен. Содержит ли typeof provider_preapproval свойство с именем activity_code_type? - потому что родитель provider_service_dtls также имеет свойство с именем activity_code_type? Мое лучшее предположение состоит в том, что шаблон должен быть provider_service_dtls.cshtml, а в главном представлении, предполагая его @model IEnumerable<provider_service_dtls>, тогда это просто @Html.EditorFor(m => m, new { options = (SelectList)@ViewBag.activity_code_type }) - person ; 02.07.2015
comment
И, пожалуйста, вам действительно нужно начать использовать обычные соглашения для именования ваших классов и имен свойств :) - person ; 02.07.2015
comment
@stepehmuecke provider_preapproval не имеет имен свойств activity_code_type, оно есть только в provider_service_dtls, но provider_preapproval может содержать несколько provider_service_dtls, а мой основной вид - @model Provider.Models.provider_preapproval - person Sachu; 02.07.2015
comment
Давайте продолжим обсуждение в чате. - person Sachu; 02.07.2015

Просто вы можете попробовать это, используя список типов моделей IEnumerable, например

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

Надеюсь, это сработает

person gdmanandamohon    schedule 03.08.2016