在我看来,我有一个enumdropdownlist(Asp.Net MVC 5.1中的新功能)。
@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"})
但现在问题是当我运行它时,我的下拉列表看起来像这样 因此,默认情况下不显示我想显示的默认文本。 如果用户选择“选择许可证”并尝试提交表单,则会显示错误“选择许可证”,但不会显示为默认文本。 我需要改变什么?
Ps:图片是加载时页面的屏幕截图。默认情况下,它会将“试用”显示为选定选项。
答案 0 :(得分:81)
尝试更改Index
LicenseTypes
的{{1}}从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)
答案 1 :(得分:63)
当您呈现EnumDropDownListFor
时,SelectedLicense
已经具有该类型的默认值,即0
。
只需将SelectedLicense
属性的类型更改为可为空的枚举,如下所示:
public LicenseTypes? SelectedLicense { get; set; }
这也允许您继续使用Required
属性,我认为该属性非常清晰。 Required
属性不允许空响应,因此即使您的模型允许空值,表单也不会。
答案 2 :(得分:16)
我有一个枚举:
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"})
通过这个我有一个默认选项的下拉菜单#34;选择性别",但验证仅接受enum提供的选项("男性"和#34;女性")。
在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" })
答案 3 :(得分:9)
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>
}
答案 4 :(得分:0)
我有点晚了吗?
更改枚举类型的值并不十分令人满意。
既不更改模型属性以使其可为空,然后添加[Required]属性以防止它可以为空。
我建议使用ViewBag设置下拉列表的默认选定值。 控制器的第4行是唯一重要的一个。
编辑:啊......新手...我的第一个想法是使用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
}