枚举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; }
}
不知何故球的尺寸属性始终在下拉列表中,这是'小'第一个值。不管我选什么。
如果您检查浏览器的下拉列表中,你的版本,你会看到它的名称为Size.Size
。这会导致绑定在发布到Create
动作时发生作用(假设这只是预期Ball
模型,因为您未在此处包含此模型),因为该名称的名称为Size
。
这对我的作品时,我改变你的EditorTemplate所以最后一行是:
@Html.DropDownListFor(m => m, items)
使用DropDownListFor
确保产生select
元素得到正确的名称。
就是这样。如果我用'Html.DropDownList(“”,items)''替换'Html.DropDownList(“Size”,items)',它也可以。非常感谢你的帮助! –
尝试去除value.toString的ToString()()
如果您未设置所选值并提交,会发生什么情况? –
它仍然使用下拉列表中的第一个值,它们与enum –
中声明的顺序相同,您可以使用@ Html.DropDownListFor替换@ Html.EditorForModel()并尝试。 –