Html.EnumDropdownListFor:显示默认文本

在我看来,我有一个enumdropdownlist (Asp.Net MVC 5.1中的一个新function)。

@Html.EnumDropDownListFor(m => m.SelectedLicense,new { @class="form-control"}) 

如果我执行上面的代码,我得到我的下面的枚举下拉列表。

 public enum LicenseTypes { Trial = 0, Paid = 1 } 

但默认情况下,我希望我的下拉列表有一个值(自定义文本),这就是我所尝试的

 @Html.EnumDropDownListFor(m => m.SelectedLicense,"Select a license" ,new { @class="form-control"}) 

但现在的问题是,当我运行它,我的下拉列表看起来像这样 在这里输入图像说明 所以,我想要显示的默认文本不会默认显示。 如果用户select“select许可证”并尝试提交表单,则会显示“select许可证”错误,但不显示为默认文本。 我需要改变的东西?

Ps:图像是加载页面的屏幕截图。 默认情况下,它会显示试用为选定的选项。

尝试更改LicenseTypesIndex1开始而不是像下面这样:

 public enum LicenseTypes { Trial = 1, Paid = 2 } 

然后您可以使用Range attribute来validation所选的许可证types,如下所示:

 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已经有了这个types的默认值,即0

只需将您的SelectedLicense属性的types更改为可为空的枚举,如下所示:

 public LicenseTypes? SelectedLicense { get; set; } 

这也允许你继续使用Required属性,我认为这个属性是非常干净的。 Required属性不允许空响应,所以即使你的模型允许空值,表单也不会。

我有一个枚举:

 public enum Sex { Male, Female } 

在我的模型中,我有:

  [DisplayName("Sex")] [Required] public Sex? Sex { get; set; } 

一个观点:

  @Html.EnumDropDownListFor(model => model.Sex, "Select sex", new { @class = "form-control", type = "text"}) 

通过这个我有一个下拉默认选项“select性别”,但validation只接受由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属性上设置默认值,使其成为默认select的public

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

我有点晚了?

更改枚举types的值不是很令人满意。

也不会更改模型属性使其可以为空,然后添加[必需的]属性,以防止它可以为空。

我build议使用ViewBag来设置下拉列表的默认选定值。 控制器的第四行是唯一重要的。

编辑:啊…新手…我的第一个想法是使用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(); } } } 

视图:

 @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”,而不是“Select your music …”