枚举DropDownList总是返回列表中的第一个值

问题描述:

我为我使用的一些枚举创建了几个EditorTemplates,这样当我使用EditorForModel()时它们将显示为DropDownLists。但是,当我从列表中选择一个项目后提交表单时,它始终在下拉列表中提交第一个项目,而不是选定的项目。枚举DropDownList总是返回列表中的第一个值

举例来说,如果我有一个枚举叫做“尺寸”它具有价值“小”“中”“大”。 EditorForModel将创建一个下拉框,以的顺序显示“小”,'中','大'。如果我然后选择'Large',然后查看数据库中的模型条目的详细信息,则会显示'Small'这是不正确的。

这里是什么,我有一些示例代码:

Sizes.cshtml(编辑模板)

@model Options.Sizes 

@{ 
    var values = Enum.GetValues(typeof(Options.Sizes)).Cast<Options.Sizes>(); 

    IEnumerable<SelectListItem> items = 
     from value in values 
     select new SelectListItem 
     { 
      Text = value.ToString(), 
      Value = value.ToString(), 
      Selected = (value.Equals(Options.Sizes.Small)) 
     }; 
} 

@Html.DropDownList("Size", items) 

Options.cs(类持有枚举)

public class Options 
{ 
    public enum Sizes 
    { 
     Small, 
     Medium, 
     Large 
    }; 
} 

Create.cshtml(查看)

@model = ProjectName.Models.Ball 

<form asp-action="Create" asp-controller="Ball"> 
    @Html.EditorForModel() 
    <input type="submit" value="submit"> 
</form> 

Ball.cs(型号)

public class Ball 
{ 
    [Key] 
    public Nullable<int> ID { get; set; } 

    public string Name { get; set; } 

    public Options.Sizes Size { get; set; } 
} 

不知何故球的尺寸属性始终在下拉列表中,这是'小'第一个值。不管我选什么。

+0

如果您未设置所选值并提交,会发生什么情况? –

+0

它仍然使用下拉列表中的第一个值,它们与enum –

+0

中声明的顺序相同,您可以使用@ Html.DropDownListFor替换@ Html.EditorForModel()并尝试。 –

如果您检查浏览器的下拉列表中,你的版本,你会看到它的名称为Size.Size。这会导致绑定在发布到Create动作时发生作用(假设这只是预期Ball模型,因为您未在此处包含此模型),因为该名称的名称为Size

这对我的作品时,我改变你的EditorTemplate所以最后一行是:

@Html.DropDownListFor(m => m, items) 

使用DropDownListFor确保产生select元素得到正确的名称。

+0

就是这样。如果我用'Html.DropDownList(“”,items)''替换'Html.DropDownList(“Size”,items)',它也可以。非常感谢你的帮助! –

尝试去除value.toString的ToString()()