Html.DropdownListДля вибраного значення не встановлюється


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>

Але з якоїсь причини Сполучене Королівство залишається вибраним, але я хочу, щоб було вибрано "Будь ласка, виберіть країну".

Хтось знає, як я можу цього досягти?

EDIT

Я оновив свій код, оскільки відбулася невелика зміна функціональних можливостей, однак, як і раніше стикається з цією проблемою. Це те, що на мій погляд:

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

1це ідентифікатор того, optionщо я хочу вибрати, я також спробував з текстом, optionале це також не працює.

Якісь ідеї?

Відповіді:


181

У вашому коді є деякі концептуальні проблеми:

По-перше ,

@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:

Модель перегляду:

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

42
Врятував мій день: "... є невелика помилка, коли ваше властивість ViewBag, де ви тримаєте SelectList, є однаковим іменем властивості, куди ви вводите вибране значення. Щоб уникнути цього, просто використовуйте інше ім'я, називаючи утримання власності список елементів ". Дякую!
Michael A. Volz aka Flynn

4
Ця "маленька помилка" - абсолютний маразм! Просто втратив через це 2 години свого життя. Як може щось настільки очевидне все ще існувати і не лататись?
цен

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

2
є маленька помилка ? Це зовсім не помилка. Прив'язка моделі працює шляхом прив'язки до значення властивості та при прив'язці до OrderTemplatesспроби прив'язки до ViewBagвластивості, що є типом IEnumerabe<SelectListItem>. Але <select>елемент не може прив'язуватися до колекції складних об'єктів (лише тип значення)

Святе лайно, я витратив би цілий день, якби не ця відповідь. Серйозно, тому МАЛИЙ
ПОМИЛОК,

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
Ваш контролер має неправильну кількість дужок: у нього є одна відкриваюча дужка та дві закриваючі дужки.
Амос Лонг

Логіка JQuery працює для мене. Дякую.
Шашанк

7

Коли ви передаєте такий об’єкт:

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

ви кажете: Source ( Model) та Key ( "Code") Text ( "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

Якщо ви знаєте, що буде у поданні, ви також можете встановити значення за замовчуванням у Controller, а потім встановити його у файл 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 {Text = 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не обов’язково потрібен a 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

У мене була подібна проблема, я використовував ViewBag та ім'я Element як те саме. (Помилка друку)


0

Це питання CSS. Я не знаю, чому @ Html.DropDownListFor у Bootstrap 4 працює. Звичайно, це проблема дизайну класу. У будь-якому випадку робоче середовище є, якщо у вашому розкривному вікні вводу є відступ CSS: #px, # px; потім вимкніть його. Сподіваюся, це спрацює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.