例如,当枚举是......
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)
预期行为:
预期行为:如果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)
我对任何更好的想法持开放态度?
答案 0 :(得分:1)
您是否尝试将[Required]
属性添加到ProcessingFrequency属性?
答案 1 :(得分:0)
选择不支持占位符或描述性值。 MVC所做的是以下列形式向选择列表添加一个附加选项:
<option value="">Select frequency</option>
这是一个有效的选项,但是,没有任何内容可以阻止用户选择它。这是验证的来源。如果发布的值为null或为空,表示用户明确选择Select frequency
或将其保留为默认选择状态,则将其视为空值。如果您的属性不可为空,或者可以为空但需要(通过[Required]
属性),则会在模型状态中添加错误。