我为我正在使用的一些枚举创建了几个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'。无论我选择什么。
答案 0 :(得分:1)
如果您检查浏览器中的下拉列表,您会看到它的名称为Size.Size
。这会导致绑定在您发布到Create
操作时不起作用(假设您只是期待Ball
模型,因为您没有在此处包含它),因为期望名称为{ {1}}。
当我更改EditorTemplate时,它对我有用,所以最后一行是:
Size
使用@Html.DropDownListFor(m => m, items)
可确保生成的DropDownListFor
元素获得正确的名称。
答案 1 :(得分:0)
尝试从value.toString()
中删除.toString()