Формат html.EnumDropdownListFor: отображение текста по умолчанию
на мой взгляд у меня есть enumdropdownlist (новая функция в Asp.Net MVC 5.1).
@Html.EnumDropDownListFor(m => m.SelectedLicense,new { @class="form-control"})
Если я выполнить приведенный выше код, я получаю dropdownlist для моего следующего перечисления.
public enum LicenseTypes
{
Trial = 0,
Paid = 1
}
но по умолчанию я хочу, чтобы мой выпадающий список имел значение(пользовательский текст)
и это то, что я пробовал
@Html.EnumDropDownListFor(m => m.SelectedLicense,"Select a license" ,new { @class="form-control"})
но теперь проблема в том, когда я запускаю его, мой выпадающий список выглядит так

Таким образом, текст по умолчанию, который я хочу показать, не отображается по умолчанию.
Если пользователь выбирает "выбрать лицензию "и пытается отправить форму, она показывает сообщение об ошибке" выбрать лицензию", но она не отображается как текст по умолчанию.
Что мне нужно изменить?
Ps: изображение-это скриншот страницы при ее загрузке. По умолчанию он будет показывать пробную версию как выбранную опцию.
5 ответов:
попробуйте изменить
IndexнаLicenseTypesначнем с1не0, как показано ниже:public enum LicenseTypes { Trial = 1, Paid = 2 }затем вы можете использовать
Range attributeдля проверки выбранного типа лицензии, как показано ниже:public class YourViewModel { //Other properties [Range(1,int.MaxValue,ErrorMessage = "Select a correct license")] public LicenseTypes LicenseTypes { get; set; } }наконец-то, на ваш взгляд:
@Html.EnumDropDownListFor(m => m.LicenseTypes,"Select a license",new { @class = "form-control"}) @Html.ValidationMessageFor(m => m.LicenseTypes)
на время
EnumDropDownListForоказываетсяSelectedLicenseуже есть значение по умолчанию для типа, который является0.просто измените тип вашего
SelectedLicenseсвойства, допускающего значение null типа enum, вот так:public LicenseTypes? SelectedLicense { get; set; }это также позволяет вам продолжать использовать
Requiredатрибут, который я думаю, значительно чище. ЭлементRequiredатрибут не позволит нулевой ответ, так что даже если ваша модель допускает нули, форма не будет.
у меня есть перечислимый:
public enum Sex { Male, Female }в моей модели у меня есть:
[DisplayName("Sex")] [Required] public Sex? Sex { get; set; }An в представлении:
@Html.EnumDropDownListFor(model => model.Sex, "Select sex", new { @class = "form-control", type = "text"})при этом у меня есть выпадающий список с опцией по умолчанию "выбрать пол", но проверка принимает только параметры, предоставляемые enum ("мужской" и "женский").
в MVC3 (без EnumDropDownListFor) я использовал в модели:
[DisplayName("Sex")] [Required(AllowEmptyStrings=false)] public Sex? Sex { get; set; } Sex = null; Sexes = Repository.GetAutoSelectList<Sex>("");в виде:
@Html.DropDownListFor(model => model.Sex, Model.Sexes, new { @class = "form-control", type = "text" })
класс ViewModel должен иметь значение по умолчанию, установленное в свойстве enum, чтобы оно было выбрано по умолчанию публика
:public class Test { public Cars MyCars { get; set; } public enum Cars { [Display(Name = @"Car #1")] Car1 = 1, [Display(Name = @"Car #2")] Car2 = 2, [Display(Name = @"Car #3")] Car3 = 3 } }public class EnumController : Controller { // GET: Enum public ActionResult Index() { var model = new Test {MyCars = Test.Cars.Car3}; // set default value return View(model); } [HttpPost] public ActionResult Index(Test model) { ..... } }View:
@Html.BeginForm() { <div class="panel bg-white"> <div class="panel-header fg-white"> Enums </div> <div class="panel-content"> <div class="input-control select size3"> @Html.EnumDropDownListFor(model => model.MyCars) </div> </div> <input type="submit" class="button success large" /> </div> }
Я немного опоздал ?
изменение значений типа перечисления не очень удовлетворительно.
также не изменяется свойство модели, чтобы сделать его nullable, а затем добавить атрибут [Required], чтобы он не был nullable.
Я предлагаю использовать ViewBag для установки выбранного по умолчанию значения выпадающего списка. линия 4 контроллера просто ниже является единственным важным.
EDIT: Ах... новички... Мой первой идеей было использовать ModelState.SetModelValue, потому что мой инстинкт новичка помешал мне просто попытаться установить желаемое значение в ViewBag, так как выпадающий список был привязан к модели. Я был уверен, что у меня будет проблема: он будет привязан к свойству модели, а не к свойству ViewBag. Я был неправ: ViewBag в порядке. Я исправил код.
здесь образец.
модель:
:namespace WebApplication1.Models { public enum GoodMusic { Metal, HeavyMetal, PowerMetal, BlackMetal, ThashMetal, DeathMetal // . . . } public class Fan { [Required(ErrorMessage = "Don't be shy!")] public String Name { get; set; } [Required(ErrorMessage = "There's enough good music here for you to chose!")] public GoodMusic FavouriteMusic { get; set; } } }namespace WebApplication1.Controllers { public class FanController : Controller { public ActionResult Index() { ViewBag.FavouriteMusic = string.Empty; //ModelState.SetModelValue( "FavouriteMusic", new ValueProviderResult( string.Empty, string.Empty, System.Globalization.CultureInfo.InvariantCulture ) ); return View( "Index" ); } [HttpPost, ActionName( "Index" )] public ActionResult Register( Models.Fan newFan ) { if( !ModelState.IsValid ) return View( "Index" ); ModelState.Clear(); ViewBag.Message = "OK - You may register another fan"; return Index(); } } }View:
@model WebApplication1.Models.Fan <h2>Hello, fan</h2> @using( Html.BeginForm() ) { <p>@Html.LabelFor( m => m.Name )</p> <p>@Html.EditorFor( m => m.Name ) @Html.ValidationMessageFor( m => m.Name )</p> <p>@Html.LabelFor( m => m.FavouriteMusic )</p> <p>@Html.EnumDropDownListFor( m => m.FavouriteMusic, "Chose your favorite music from here..." ) @Html.ValidationMessageFor( m => m.FavouriteMusic )</p> <input type="submit" value="Register" /> @ViewBag.Message }
Comments