当Enum可以为空时,如何在EnumDropDownList中显示提示作为默认文本?

时间:2015-02-26 16:05:29

标签: c# asp.net asp.net-mvc enums html.dropdownlistfor

例如,当枚举是......

    public enum TaskFrequency
    {
        Weekly,
        [Display(Name = "Bi-weekly")]
        Biweekly,
        Monthly,
        Quarterly
    }

在ViewModel中使用,例如......

    [Display(Name = "Processing frequency", Prompt = "Select frequency")]
    public Enums.TaskFrequency? ProcessingFrequency { get; set; }

实现(在自定义编辑器Enum.cshtml中)......

    @Html.EnumDropDownListFor(model => model,
        optionLabel: ViewData.ModelMetadata.Watermark)

预期行为:

enter image description here

预期行为:如果value为null(声明为可空),则显示提示,并在列表中显示。如果不可为空(必需),则显示提示,但不包括在选择列表项中。预计在非可空的情况下,应该要求验证确保没有空值返回服务器以更新模型。

请参阅desired behaviour的小提琴手。实际发生的事情是{n 3}可以使用blank item in list并且没有使用占位符,或者optionLabel变为another list item并且不用作任何占位符。

编辑/解决:

似乎EnumDropDownListFor帮助程序没有那么有用。我作为一个解决方案解决的问题是使用枚举与第一个(0基础)项目作为"未选择"项目与[显示(名称="选择项目")]装饰器,然后根据需要在ViewModel类枚举类型中声明(省略'?'类型名称)然后默认表格中的数据值为' 0'。

例如......

枚举:

    public enum TaskFrequency
    {
        [Display(Name = "Select frequency")]
        Unselected,
        Weekly,
        [Display(Name = "Bi-weekly")]
        Biweekly,
        Monthly,
        Quarterly
    }

ViewModel类声明('?'和删除提示):

    [Display(Name = "Processing frequency"]
    public Enums.TaskFrequency ProcessingFrequency { get; set; }

从自定义编辑器Enum.cshtml中删除optionLabel,留下:

    @Html.EnumDropDownListFor(model => model)

使用客户编辑器(上图),可以在View中使用:

    @Html.EditorFor(model => model.Frequency)

我对任何更好的想法持开放态度?

2 个答案:

答案 0 :(得分:1)

您是否尝试将[Required]属性添加到ProcessingFrequency属性?

答案 1 :(得分:0)

选择不支持占位符或描述性值。 MVC所做的是以下列形式向选择列表添加一个附加选项:

 <option value="">Select frequency</option>

这是一个有效的选项,但是,没有任何内容可以阻止用户选择它。这是验证的来源。如果发布的值为null或为空,表示用户明确选择Select frequency或将其保留为默认选择状态,则将其视为空值。如果您的属性不可为空,或者可以为空但需要(通过[Required]属性),则会在模型状态中添加错误。