我有一个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;
}
}
"Select"选项始终在下拉列表中选中,即使我可以遍历代码并看到其中一个SelectListItem对象的Selected
属性设置为true
。
我已经尝试了在我的模板化助手中推荐的解决方案,使用DropDownListFor并不反映枚举的模型。为什么?但是这个解决方案是面向MVC 3的。我尝试了这个解决方案(将SelectList
对象作为第二个参数传递给Html.DropDownListFor
),得到的只是一个下拉列表,其中有4个选项,显示文本为"System.Web.Mvc.SelectListItem",而<option>
标记没有值。
此外,我还尝试了创建@Html.EnumDropDownListFor(...)
辅助函数的其他解决方案,其行为与此相同。看起来,尽管选择了正确的SelectListItem
,但可能当前的Model.Status
值正在覆盖它?
更新#1
我添加了一个名为StatusId
的整数属性,它获取并设置Status
属性为整数,这在调用Html.DropDownListFor(model => model.StatusId, ...)
时有效,但我希望找到一个允许我直接使用枚举值的解决方案,而不是通过另一个属性作为代理。
由于一些疯狂的原因,Razor将枚举值呈现为基于字符串的名称,而不是其整数值对应的名称。无论如何,我的猜测是,SelectHelper
返回的选项的值是整数,这就是为什么将枚举值转换为int允许选择工作的原因。无论如何,由于这是一个自定义组件,我建议您只需修改助手,将枚举字符串名称作为选项值而不是int返回。然后属性值和选项值将正确对齐。