Html.DropdownListДля выбранного значения не задано

Как я могу установить выбранное значение 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, но это также не работает.

Любые идеи?

Ответ 1

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

Первая

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

Ответ 2

У меня не получилось, так сработало так:

контроллер:

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');
});

Ответ 3

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

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

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

Ответ 4

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

//Model

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

Ответ 5

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

В файле Controller.

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

В файле .cshtml.

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

Ответ 6

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

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

Ответ 7

Добавить раздел контроллера

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Добавьте раздел Html

   @Html.DropDownList("Orders", null)

Простой метод

Ответ 8

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

@{
     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" })
     }
}

Ответ 9

Linq для 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 });

Ответ 10

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

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

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

Затем я начал копаться в официальном msdn doc и обнаружил, что 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.

Ответ 11

public byte UserType
public string SelectUserType

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

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

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

Ответ 12

У меня была похожая проблема, я использовал одинаковые имена ViewBag и Element. (Опечатка)