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
}
но по умолчанию я хочу, чтобы мой dropdownlist имел значение (пользовательский текст)
и это то, что я пробовал
@Html.EnumDropDownListFor(m => m.SelectedLicense,"Select a license" ,new { @class="form-control"})
но теперь проблема заключается в том, когда я запускаю его, мой dropdownlist выглядит так
Таким образом, текст по умолчанию, который я хочу показать, по умолчанию не отображается.
Если пользователь выбирает "выбрать лицензию" и пытается отправить форму, в ней отображается сообщение об ошибке "выберите лицензию", но оно не отображается как текст по умолчанию.
Что-то мне нужно изменить?
Ps: Изображение - это скриншот страницы, когда он загружается. По умолчанию он отобразит пробную версию в качестве выбранной опции.
Ответы
Ответ 1
Попробуйте изменить Index
LicenseTypes
на начало с 1
not 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)
Ответ 2
К тому времени, когда ваш EnumDropDownListFor
отображается SelectedLicense
, уже имеет значение по умолчанию для типа 0
.
Просто измените тип вашего свойства SelectedLicense
на нулевое перечисление, например:
public LicenseTypes? SelectedLicense { get; set; }
Это также позволяет вам продолжать использовать атрибут Required
, который, по моему мнению, значительно чище. Атрибут Required
не позволит получить нулевой ответ, поэтому, даже если ваша модель допускает нули, форма не будет.
Ответ 3
У меня есть перечисление:
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"})
При этом у меня есть раскрывающийся список с опцией по умолчанию "Выбрать секс", но валидация принимает только опции, предоставляемые перечислением ( "Мужчина" и "Женщина" ).
В 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" })
Ответ 4
Класс 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)
{
.....
}
}
Вид:
@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>
}
Ответ 5
Я немного опоздал?
Изменение значений типа перечисления не очень удовлетворяет.
Ни одно из них не изменяет свойство модели, чтобы сделать его нулевым, а затем добавить атрибут [Обязательный], чтобы он не мог быть нулевым.
Я предлагаю использовать ViewBag для установки выбранного по умолчанию выпадающего списка.
Линия 4 контроллера, только ниже, является единственной важной.
EDIT: Ah... newbies... Моя первая идея заключалась в использовании 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 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();
}
}
}
Вид:
@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
}
Без строки ModelState.SetModelValue или ViewBag.FavouriteMusic = string.Empty в действии индекса модели по умолчанию выбранное значение будет "Metal" , а не "Выберите свою музыку..."