我有一个ASP.NET MVC 4站点和一个使用Enum的域模型。我能够生成SelectListItem
个对象的列表,但是没有选择正确的项目。
域名模型
public enum ApplicationStatus
{
Unknown = 0,
Incomplete = 1,
Submitted = 2,
Error = 4
}
public class Application
{
public ApplicationStatus Status { get; set; }
// ...
}
“修改”视图
@model Application
@using (Html.BeginForm("Edit", "Applications", new { ... }, FormMethod.Post, new { role = "form", @class = "form-horizontal" }))
{
@Html.Partial("_Form", Model)
<p>
@Html.ActionLink("Cancel", "Details", new { ... }, new { @class = "btn btn-default" })
<button type="submit" class="btn btn-primary">Save</button>
</p>
}
“_ Form”部分
@model BWE.Models.Entity.BitWeb.Application
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.Status, new { @class = "col-sm-2" })
<div class="col-sm-10">
@Html.DropDownListFor(model => model.Status, SelectHelper.GetApplicationStatusOptions(Model.Status))
@Html.ValidationMessageFor(model => model.Status)
</div>
</div>
SelectHelper
public static class SelectHelper
{
public static IEnumerable<SelectListItem> GetApplicationStatusOptions(ApplicationStatus currentStatus)
{
var items = new List<SelectListItem>()
{
new SelectListItem()
{
Text = "Select",
Value = string.Empty
}
};
IEnumerable<ApplicationStatus> statuses = Enum.GetValues(typeof(ApplicationStatus)).Cast<ApplicationStatus>();
foreach (var status in statuses)
{
if (status == ApplicationStatus.Unknown)
continue;
items.Add(new SelectListItem()
{
Text = status.ToString(),
Value = ((int)status).ToString(),
Selected = status == currentStatus
});
}
return items;
}
}
总是在下拉列表中选择“选择”选项,即使我可以单步执行代码并看到其中一个SelectListItem对象将其Selected
属性设置为true
。
我已尝试过My templated helper using a DropDownListFor does NOT reflect the model of enum. Why?中推荐的解决方案,但此解决方案适用于MVC 3.我尝试了解决方案(将SelectList
对象作为第二个参数传递给Html.DropDownListFor
)我得到的是一个包含4个选项的下拉列表,其显示文本为“System.Web.Mvc.SelectListItem”,而<option>
标签没有值。
此外,我尝试了其他创建@Html.EnumDropDownListFor(...)
辅助函数的解决方案,其行为方式相同。似乎所有正确的SelectListItem
都被选中,当前Model.Status
值可能会覆盖它吗?
我添加了一个名为StatusId
的整数属性,它获取并将Status
属性设置为整数,这在调用Html.DropDownListFor(model => model.StatusId, ...)
时有效但是我希望有一个解决方案允许我直接使用枚举值,而不是通过另一个属性作为代理。
答案 0 :(得分:2)
出于某些疯狂的原因,枚举值由Razor呈现为基于字符串的名称,而不是它们的整数值对应物。无论如何,我的猜测是你的SelectHelper
返回值为整数的选项,这就是为什么将你的枚举值转换为int允许选择工作的原因。由于这是一个你自己的自定义组件,我建议只需修改你的帮助器,将枚举字符串名称作为选项值而不是整数返回。然后,属性值和选项值将正确排列。