Html.DropdownListFor выбранное значение не задано


97

Как я могу установить выбранное значение Html.DropDownListFor? Я искал в Интернете и увидел, что этого можно достичь, используя четвертый параметр, как показано ниже:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

Мой список выбора будет отображаться следующим образом:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

Но по какой-то причине Великобритания остается выбранной, но я хочу, чтобы было выбрано «Пожалуйста, выберите страну».

Кто-нибудь знает, как я могу этого добиться?

РЕДАКТИРОВАТЬ

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

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1- это идентификатор того, optionчто я хочу выбрать, я также пробовал использовать текст, optionно это тоже не работает.

Любые идеи?

Ответы:


182

В вашем коде есть некоторые концептуальные проблемы:

Во-первых ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

При использовании DropDownListFor первым параметром является свойство, в котором будет сохранено выбранное вами значение после отправки формы. Итак, в вашем случае у вас должен быть SelectedOrderIdкак часть вашей модели или что-то в этом роде, чтобы использовать ее таким образом:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Второй ,

Помимо использования ViewBag, это не так, но есть лучшие способы (вместо этого поместите эту информацию в ViewModel), есть «небольшая ошибка» (или непредвиденное поведение), когда ваше свойство ViewBag, в котором вы держите SelectList, то же название собственности, где вы положили выбранное значение. Чтобы этого избежать, просто используйте другое имя при именовании свойства, содержащего список элементов.

Некоторый код, который я бы использовал на вашем месте, чтобы избежать этих проблем и написать лучший код MVC:

Viewmodel:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

Контроллер:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

В вашем представлении:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")

43
Спас мой день: "... есть небольшая ошибка, когда ваше свойство ViewBag, в котором вы держите SelectList, совпадает с именем свойства, в которое вы поместили выбранное значение. Чтобы избежать этого, просто используйте другое имя при именовании свойства, содержащего список предметов ". Спасибо!
Майкл А. Фольц, он же Флинн,

4
Этот «маленький жучок» - абсолютное безумие! Просто потратил 2 часа своей жизни из-за этого. Как может что-то столь очевидное все еще существовать и не исправляться?
сент

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

2
есть баг ? Это вообще не ошибка. Привязка модели работает путем привязки к значению свойства и когда вы выполняете привязку к OrderTemplatesсвоей попытке привязки к ViewBagсвойству typeof IEnumerabe<SelectListItem>. Но <select>элемент не может быть привязан к коллекции сложных объектов (только тип значения)

Черт возьми, я бы потратил впустую целый день, если бы не этот ответ. Серьезно, эта МАЛЕНЬКАЯ ОШИБКА - вот почему мы должны отказаться от просмотра
Worthy7

22

Для меня не работал, поэтому работал так:

Контроллер:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

Посмотреть:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

2
В вашем контроллере неправильное количество круглых скобок: у него одна открывающая скобка и две закрывающие.
Амос Лонг,

7

Когда вы передаете такой объект:

new SelectList(Model, "Code", "Name", 0)

вы говорите: Источник ( Model) и Ключ ( "Code") Текст ( "Name") и выбранное значение 0. Вероятно, у вас нет 0значения в источнике для Codeсвойства, поэтому помощник HTML выберет первый элемент, чтобы передать этому элементу управления реальное selectedValue.


3

Перед назначением убедитесь, что вы обрезали выбранное значение.

//Модель

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

// Контроллер

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//Посмотреть

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

2

Если вы знаете, что будет в представлении, вы также можете установить значение по умолчанию из контроллера, а не устанавливать его в файл view / cshtml. Нет необходимости устанавливать значение по умолчанию со стороны HTML.

В файле контроллера.

commission.TypeofCommission = 1;
return View(commission);

В файле .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")

1

Вы должны забыть о классе

SelectList

Используйте это в своем контроллере:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

Выберите значение:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

Добавьте список в ViewData:

ViewBag.CustomerTypes = customerTypes;

Используйте это в своем представлении:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

Дополнительная информация: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc



0

Для меня общее решение :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}

0

Linq to Dropdown с пустым элементом, выбранным элементом (работает на 100%)
(строго типизирован, вероятность ошибки минимальна) Любые изменения модели будут отражены в привязке

Контроллер

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

Посмотреть

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

Этот метод привязки данных также возможен

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

var selList = CompTypeList.Select (s => new SelectListItem {Текст = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? true: false});

0

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

Моя ошибка заключалась в том, что я пытался создать SelectList из словаря следующим образом:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

Затем я покопался в официальном документе msdn и обнаружил, что DropDownListForэто не обязательно требует SelectList, а скорее IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

В моем случае я, вероятно, также могу опустить Model.Localityвыбранный элемент, так как это а) единственный элемент и б) он уже говорит об этом в SelectListItem.Selectedсвойстве.

На всякий случай, если вам интересно, источником данных является страница AJAX, которая динамически загружается с помощью элемента управления SelectWoo / Select2.


0
public byte UserType
public string SelectUserType

Вам нужно получить один и установить другой. Выбранное значение не может быть тем же элементом, который вы собираетесь установить.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

Я использую словарь Enum для своего списка, поэтому есть пара «ключ», «значение».



0

Это проблемы с CSS. Я не знаю, почему @ Html.DropDownListFor в Bootstrap 4 действительно работает. Конечно, это проблема дизайна классов. В любом случае, если в вашем поле ввода Dropdown есть CSS Padding: #px, # px; затем отключите его. Надеюсь, это сработает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.