Html.EnumDropdownListFor:显示默认文本

时间:2014-02-19 11:06:27

标签: 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"})

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

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

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

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

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

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

5 个答案:

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

Without the "ModelState.SetModelValue or ViewBag.FavouriteMusic = string.Empty" line in the model Index action the default selected value would be "Metal" and not "Select your music..."