MVC5 – Как установить «selectedValue» в DropDownListFor Html helper
В этом вопросе говорится: Как установить selectedValue в помощнике DropDownListFor Html?
Пробовал большинство других решений, но никто не работал, поэтому я открываю новый вопрос.
Ничто из этого не помогло:
- Как создать текстовое поле readonly в ASP.NET MVC3 Razor
- SelectListItem с атрибутами данных
- Расширения Razor HtmlHelper (или другие пространства имен для просмотров) Не найдено
- Использование MVC HtmlHelper из WebForm
- В чем разница между RouteLink и ActionLink в ASP.NET MVC?
@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2), htmlAttributes: new { @class = "form-control" }) //Not working with or without cast @Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Single(x => x.Id == 2)), htmlAttributes: new { @class = "form-control" }) @Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Where(x => x.Id == 2).FirstOrDefault()), htmlAttributes: new { @class = "form-control" }) @Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", new SelectListItem() { Value="2", Selected=true}), htmlAttributes: new { @class = "form-control" })
Я хотел бы избежать ручного создания SelectListItems или ViewModel только для списка, если это возможно.
- Разница между Html.RenderAction и Html.Action
- Как применить class CSS к Html.ActionLink в ASP.NET MVC?
- MVC HTML Helpers и выражения lambda
- Что делает Html.HiddenFor?
- Получить атрибут DisplayName без использования LabelFor Helper в asp.net MVC
- Метод HTML.ActionLink
- MVC 3 - Html.EditorFor, похоже, кэширует старые значения после вызова $ .ajax
- ASP.NET MVC 3: переопределить атрибут «name» с помощью TextBoxFor
Когда вы используете метод DropDownListFor()
(или DropDownList()
) для привязки к свойству модели, его значение свойства, которое устанавливает выбранную опцию.
Внутри методы генерируют собственный IEnumerable
и устанавливают свойство Selected
на основе значения свойства, поэтому установка свойства Selected
в вашем коде игнорируется. Единственный раз, когда его уважают, когда вы не привязываетесь к свойству модели, например, используя
@Html.DropDownList("NotAModelProperty", new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2))
Обратите внимание, что вы можете проверить исходный код , в частности SelectInternal()
и GetSelectListWithDefaultValue()
чтобы увидеть, как он работает подробно.
Чтобы отобразить выбранную опцию при первом представлении представления, установите значение свойства в методе GET перед тем, как передать модель в представление
Я также рекомендую, чтобы ваша модель просмотра содержала свойство IEnumerable
и что вы SelectList
в controllerе
var model = new YourModel() { TipoviDepozita = new SelectList(yourCollection, "Id", "Naziv"), TipPopustaId = 2 // set the selected option } return View(model);
поэтому вид становится
@Html.DropDownListFor(m => m.TipPopustaId, Model.TipoviDepozita, new { @class = "form-control" })
Убедитесь, что ваше возвращаемое значение выбора – это строка, а не и int, когда вы объявляете ее в своей модели.
Пример:
public class MyModel { public string TipPopustaId { get; set; } }
public static class EnumHelper { public static SelectList EnumToSelectList(this Type enumType, object selectedValue) { new SelectList(Enum.GetValues(enumType).Cast ().ToList().ToDictionary(n=> n), "Key", "Value", selectedValue); } }
И в вашем представлении:
@Html.DropDownListFor(model => model.Role, EnumHelper.EnumToSelectList(typeof(Role), Model.Role), new { htmlAttributes = new { @class = "padding_right" } }) @Html.ValidationMessageFor(model => model.Role, "", new { @class = "text-danger" })
Вместо EnumToList используйте любой другой список и выберите «Ключ и значение ваших свойств списка»