【问题标题】:How to show prompt as the default text in EnumDropDownList when Enum is nullable?当 Enum 可以为空时,如何在 Enum DropDownList 中将提示显示为默认文本?
【发布时间】:2015-02-26 16:05:28
【问题描述】:

例如,当枚举是...

    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)

预期行为:

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

请参阅此提琴手desired behaviour。实际发生的情况是 blank item in list 可以为空且未使用占位符,或者 optionLabel 变为 another list item 并且不用作任何占位符。

编辑/解决方案:

EnumDropDownListFor 帮助器似乎没有它可能的帮助。我已经确定的解决方案是使用带有第一个(基于 0)项目的枚举作为带有 [Display(Name="Select item")] 装饰器的“未选择”项目,然后根据需要在 ViewModel 类枚举类型中声明(省略类型名称上的“?”)然后将表中的数据值默认为“0”。

例如...

枚举:

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

ViewModel 类声明('?' 和 Prompt 已删除):

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

并从自定义编辑器 Enum.cshtml 中移除 optionLabel,离开:

    @Html.EnumDropDownListFor(model => model)

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

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

我愿意接受任何更好的想法?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。将研究这如何增加行为逻辑的组合。但是,我想知道我是否只是删除声明上的可为空标记,这将成为“必需”。我仍然认为这个助手的预期默认行为需要工作,或者我没有正确实现,在这种情况下它需要工作,因为它不直观。 ;-)
    • 这是一种解决方法。但是,我相信您的枚举成员不应被称为“未选择”。通过这样做,您将 UI 行为注入到您的模型中。我会把它命名为“无”
    【解决方案2】:

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

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

    不过,与其他任何选项一样,这是一个有效的选项,因此没有任何东西可以阻止用户选择它。这就是验证的用武之地。如果发布的值为 null 或空,这意味着用户要么明确选择了Select frequency,要么将其保留在默认状态 selected,然后,它被视为 null 值。如果您的属性不可为空,或者可以为空但需要(通过[Required] 属性),则会将错误添加到模型状态。

    【讨论】:

    • @普拉特。真的。为什么默认情况下(不编码),这不会因为选中的项目(或文本)而提示选择?不过,将默认值设置为 0 似乎是一种解决方法,其中声明的值可以为空。这篇文章要么是对预期默认行为的请求,要么是对我不知道的设置或用于实现的设置的询问。例如,如果设置一个添加项目的“提示”,为什么必须设置 optionLabel 才能让它成为一个项目?这应该是默认行为。
    • 坦率地说,我之前从未关注过DisplayAttribute 上的Prompt 属性。我假设它必须在本机应用程序和/或 Silverlight 之类的东西中具有某种用途,您可以在其中拥有真正的控件而不仅仅是 HTML。据我所知,它在 MVC 中没有用。
    • 更正:在第一行,“因为”应该是“成为”
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多