Enum DropDownList 总是 returns 列表中的第一个值

Enum DropDownList always returns the first value in the list

我已经为我正在使用的一些枚举创建了几个 EditorTemplates,这样当我使用 EditorForModel() 时它们将显示为 DropDownLists。但是,当我在 selecting 列表中的项目后提交表单时,它总是提交下拉列表中的第一项而不是 selected 的。

例如,如果我有一个名为 "Sizes" 的枚举,它的值为 'Small''Medium',以及'Large'。 EditorForModel 将创建一个下拉列表,以 'Small''Medium'[= 的顺序显示它们62=]。如果我然后 select '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(Class 包含枚举)

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; }
}

不知何故,Ball 的 Size 属性 始终是下拉列表中的第一个值,即 'Small'。不管我怎么选。

尝试从 value.toString()

中删除 .toString()

如果您在浏览器中检查下拉菜单,您会发现在您的版本中它的名称为 Size.Size。当您 post 到您的 Create 操作时,这会导致绑定不起作用(假设这只是期待一个 Ball 模型,因为您没有在此处包含它),因为那是期待的东西名字 Size.

当我更改您的 EditorTemplate 时它对我有用,所以最后一行是:

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

使用 DropDownListFor 确保生成的 select 元素获得正确的名称。