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. (Опечатка)