1

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

例如,如果我有一个名为"Sizes"的枚举,它的值是 'Small''Medium''Large'EditorForModel 将创建一个下拉菜单,以'Small''Medium''Large'的顺序显示它们。如果我然后选择“大”,然后查看已进入数据库的模型条目的详细信息,它将显示“小”,这是不正确的。

这是我所拥有的一些示例代码:

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

创建.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'。不管我选什么。

4

2 回答 2

1

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

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

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

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

于 2017-05-05T09:48:06.670 回答
0

尝试从 value.toString() 中删除 .toString()

于 2017-05-05T08:44:01.767 回答