Enum DropDownList始终返回列表

时间:2017-05-05 08:09:08

标签: asp.net-core asp.net-core-mvc .net-core html.dropdownlistfor editorformodel

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

例如,如果我有一个名为“Sizes”的枚举,它的值为'Small''Medium',以及 '大'。 EditorForModel将创建一个下拉列表,按'Small''Medium''Large'的顺序显示它们。如果我然后选择'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; }
}

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

2 个答案:

答案 0 :(得分:1)

如果您检查浏览器中的下拉列表,您会看到它的名称为Size.Size。这会导致绑定在您发布到Create操作时不起作用(假设您只是期待Ball模型,因为您没有在此处包含它),因为期望名称为{ {1}}。

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

Size

使用@Html.DropDownListFor(m => m, items) 可确保生成的DropDownListFor元素获得正确的名称。

答案 1 :(得分:0)

尝试从value.toString()

中删除.toString()