Html.DropDownListFor () Изменяет SelectListItems в ASP.NET MVC

Мне нужен DropDownList на странице, поэтому я пробую вот так:

Действие:

[HttpGet]
public ActionResult GetPoint() {

  ...
  List<SelectListItem> zooms = new List<SelectListItem>();
    for (int i = 0; i <= 21; i++) {
      if (i == 9)
        zooms.Add(new SelectListItem() { Selected = true, Text = i.ToString(), Value = i.ToString() });
      else
        zooms.Add(new SelectListItem() { Selected = false, Text = i.ToString(), Value = i.ToString() });
            }
  model.myselectlist = zooms;
  ...

  return View(model);
}

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

@Html.DropDownListFor(model => model.Zoom, Model.myselectlist , new { @class = "dropdown" })

Итак, как я и ожидал, у нас есть DropDownList с 9 is Selected Item.

Но в том же представлении мне нужен еще один DropDown Итак, это моя реализация:

[HttpGet]
public ActionResult GetPoint() {

  ...

  List<SelectListItem> places = new List<SelectListItem>();
  places.Add(new SelectListItem() { Text = "NY", Value = "NY", Selected = false });
  places.Add(new SelectListItem() { Text = "CA", Value = "CA", Selected = false });
  places.Add(new SelectListItem() { Text = "TX", Value = "TX", Selected = false });
  places.Add(new SelectListItem() { Text = "NH", Value = "NH", Selected = true });
  places.Add(new SelectListItem() { Text = "NV", Value = "NV", Selected = false });
  model.myselectlistII = places;

  ...

  return View(model);
}

И в View у меня есть:

@Html.DropDownListFor(model => model.Place, Model.myselectlistII , new { @class = "dropdown" })

Итак, как вы видите, у меня есть список, в котором элемент NH имеет selected = true.

И я ожидаю, что выпадающий список будет выбран NH, но это не произойдет, и всегда будет выбран первый элемент.

У меня странное поведение, я отлаживаю код в конце действия и в начале @Html.DropDownListFor строки на странице просмотра, все в порядке, но после этой строки я снова проверяю Model.myselectlistII выбранный элемент изменился и все элементы есть выбранное свойство с false, я не понимаю, что произошло? в чем проблема? почему первый DropDownFor ничего не изменил, а второй изменил мой список? что вы предлагаете?


person Saeid    schedule 31.12.2012    source источник
comment
Вы установили какое-либо значение в поле вашей модели Place (например, в конструкторе или где-то еще)? Если это так, он заменит поле Selected в вашем списке ...   -  person Samuel Caillerie    schedule 31.12.2012
comment
@SamuelCaillerie ваше право, на самом деле я ничего не устанавливаю, и я должен установить значение по умолчанию.   -  person Saeid    schedule 31.12.2012
comment
@SamuelCaillerie Так что, пожалуйста, опубликуйте свой ответ, для следующей ссылки   -  person Saeid    schedule 31.12.2012
comment
Это не совсем ответ, просто предположение, поскольку я не знаю, что находится в вашем ActionResult GetPoint() и в вашей модели model, но поскольку ваш @Html.DropDownListFor() основан на поле model.Place, если это поле инициализировано чем-то, это переопределит ваш Selected значений в _6 _...   -  person Samuel Caillerie    schedule 31.12.2012


Ответы (5)


Сэмюэл Кайлери прав. Вы используете DropDownList Для, который привязывает ваши свойства Zoom и Place к списку выбора. Какими бы ни были значения этих свойств, они будут выбраны при рендеринге представления. Не нашел хорошей документации по этому поводу, но вот еще одно сообщение о переполнении стека, которое поможет в этом:

asp.net mvc 3 pre -выберите Html.DropDownList, чтобы не работать на ужине для ботаников

person Ben Tidman    schedule 31.12.2012

Будьте осторожны, если есть QUERY STRING с таким же именем, он переопределит это поведение. Не уверен, что СКРЫТЫЕ ПОЛЯ с тем же именем

i.e.

DropDownListFor будет использовать значение Query String DinnerID, если будет найдено Blockquote

person Ahmed Eid Yamany    schedule 14.03.2013

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

namespace MyMvcApplication.Helpers
{
    public static class ExtensionMethods
    {
        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              object htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true }
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }


        public static MvcHtmlString DropDownListFor<TModel, TProperty>
                             (this HtmlHelper<TModel> helper,
                              Expression<Func<TModel, TProperty>> expression,
                              string selectedValue,
                              IEnumerable<SelectListItem> selectList,
                              string optionLabel,
                              IDictionary<string, object> htmlAttributes)
        {
            if (string.IsNullOrEmpty(selectedValue))
                selectedValue = string.Empty;
            if (selectList != null)
            {
                foreach (SelectListItem sli in selectList)
                {
                    if (sli.Value.ToLower().Trim() == selectedValue.ToLower().Trim())
                    {
                        sli.Selected = true;
                        break;
                    }
                }
            }
            else 
            { 
                selectList = new List<SelectListItem>() 
                                  { new SelectListItem() 
                                          { Text = "", Value = "", Selected = true } 
                                  };
            }
            return helper.DropDownListFor(expression, selectList, optionLabel, htmlAttributes);
        }

    }
}

Итак, в представлениях я могу передать строку как selectedValue в DropDownListFor, например:

@using MyMvcApplication.Helpers

@Html.DropDownListFor(model => model.MyData,
                               "Default Value for DropDownList", //Or Model.MySelectedValue
                               Model.MySelectList, null, null)
person Tohid    schedule 31.12.2012

Решение этой проблемы проще, чем мы все думаем ...

Все, что нам нужно сделать при возврате представления из контроллера, - это установить свойство в модели представления для элемента, к которому привязан раскрывающийся список, например: model.Zoom = 'NH'

таким образом, когда мы это делаем

@Html.DropDownListFor(model => model.Zoom, Model.myselectlist , new { @class = "dropdown" })

HtmlHelper автоматически выберет значение по умолчанию для отображения в DropDownList

просто!

Надеюсь, это поможет вам и всем остальным - таким, как я! - которые потеряли много времени на поиск решения этой очевидной проблемы.

person EdsonF    schedule 01.07.2014

Зацените, ребята !!! Супер статический функциональный ленивый способ выбора / выбора / привязки раскрывающегося списка для стиля начальной загрузки бритвы mvc;) в качестве бонуса используйте французские или английские описания !!! ваш, чтобы улучшить, но вы легко поймете идею. Развлекайся! MightyMart ...

              <div class="form-group">
                    <label>@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Quel est votre niveau d'expertise" : "What is your skill level")</label>
                    @if (Model.ClientLevel == null)
                    {
                        <select class="form-control" name="ClientLevel">
                            <option selected value="0">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Choisir un niveau" : "Choose a level")</option>
                            <option value="1">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Débutant" : "Beginner")</option>
                            <option value="2">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Intermédiaire" : "Intermediate")</option>
                            <option value="3">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Advanced" : "Advanced")</option>
                            <option value="4">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Expert" : "Expert")</option>
                            <option value="5">@(HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Autre" : "Other")</option>
                        </select>
                    }
                    else
                    {

                        List<SelectListItem> listItems = new List<SelectListItem>();
                        listItems.Add(new SelectListItem() { Text = "Choose a level", Value = "Choose a level"});
                        listItems.Add(new SelectListItem() { Text = "Beginner", Value = "Beginner" });
                        listItems.Add(new SelectListItem() { Text = "Intermediate", Value = "Intermediate"});
                        listItems.Add(new SelectListItem() { Text = "Advanced", Value = "Advanced"});
                        listItems.Add(new SelectListItem() { Text = "Expert", Value = "Expert"});
                        listItems.Add(new SelectListItem() { Text = HttpContext.Current.Session["culture"].ToString().Equals("fr-CA") ? "Autre" : "Other", Value = "Other"});

                        @Html.DropDownListFor(m => m.ClientLevel, listItems, new { @class = "form-control" })
                    }
                </div>
person Martin MightyMart Lauzon    schedule 08.04.2016