Html.EnumDropdownListFor:显示默认文本

Cyb*_*cop 63 c# asp.net-mvc drop-down-menu asp.net-mvc-5.1

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

@Html.EnumDropDownListFor(m => m.SelectedLicense,new { @class="form-control"})
Run Code Online (Sandbox Code Playgroud)

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

public enum LicenseTypes
{
    Trial = 0,
    Paid = 1
}
Run Code Online (Sandbox Code Playgroud)

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

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

但现在问题是当我运行它时,我的下拉列表看起来像这样 在此输入图像描述 因此,默认情况下不显示我想显示的默认文本.如果用户选择"选择许可证"并尝试提交表单,则会显示错误"选择许可证",但不会显示为默认文本.我需要改变什么?

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

Lin*_*Lin 82

尝试改变IndexLicenseTypes,从开始10低于这样的:

public enum LicenseTypes
{
    Trial = 1,
    Paid = 2
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用Range attribute以验证所选的许可证类型,如下所示:

public class YourViewModel
{
     //Other properties
     [Range(1,int.MaxValue,ErrorMessage = "Select a correct license")]
     public LicenseTypes LicenseTypes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最后,在您看来:

   @Html.EnumDropDownListFor(m => m.LicenseTypes,"Select a license",new { @class = "form-control"})
   @Html.ValidationMessageFor(m => m.LicenseTypes)
Run Code Online (Sandbox Code Playgroud)

  • @probackpacker有更好的答案,这个选项不会在验证处理中被捕获 (2认同)

Mic*_*son 66

EnumDropDownListFor渲染时,SelectedLicense已经具有该类型的默认值,即0.

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

public LicenseTypes? SelectedLicense { get; set; }
Run Code Online (Sandbox Code Playgroud)

这也允许您继续使用该Required属性,我认为该属性非常清晰.该Required属性不允许空响应,因此即使您的模型允许空值,表单也不会.

  • @jhilden,我认为MVC _is_通过_exactly_正确处理不可为空的Enum,你要告诉它做什么.在.NET中[枚举变量始终初始化为值0](http://stackoverflow.com/a/529937/1812515).假设您将属性类型保留为不可为空的枚举("LicenseTypes"),并且表单将通过选择"选择许可证"(没有值的列表项)发布.你的`SelectedLicense`属性最终会得到默认值(`Trial`).如果你只是检查了模型,它将与用户实际选择"Trial"值无法区分. (3认同)

rso*_*bon 16

我有一个枚举:

public enum Sex
{
    Male,
    Female
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中,我有:

    [DisplayName("Sex")]
    [Required]
    public Sex? Sex { get; set; }
Run Code Online (Sandbox Code Playgroud)

在视图中:

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

通过这个我有一个默认选项"选择性别"的下拉列表,但验证只接受枚举("男性"和"女性")提供的选项.

在MVC3(没有EnumDropDownListFor)我在模型中使用:

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

    Sex = null;

    Sexes = Repository.GetAutoSelectList<Sex>("");
Run Code Online (Sandbox Code Playgroud)

在视图中:

    @Html.DropDownListFor(model => model.Sex, Model.Sexes, new { @class = "form-control", type = "text" })
Run Code Online (Sandbox Code Playgroud)


Har*_*oon 10

ViewModel类需要在enum属性上设置默认值,以使其成为默认的选定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
        }

    }
Run Code Online (Sandbox Code Playgroud)

控制器:

 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)
        {
            .....
        }
    }
Run Code Online (Sandbox Code Playgroud)

视图:

@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>
}
Run Code Online (Sandbox Code Playgroud)