在我的MVC 3 Razor应用程序中,我有一个带枚举的模型..
模型示例:
public class EmployeeModel
{
public enum Title
{
Accountant = 111,
Sales = 222,
Production = 333
}
[Required]
public string Name {get; set;}
[Required]
public Title JobTitle {get; set;}
}
在我的视图中,我想使用Html助手来构建一个Html表单...
查看示例:
@model ..Models.EmployeeModel
@using (Html.BeginForm())
{
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
<br>
@Html.LabelFor(m => m.JobTitle)
@Html.DropDownListFor(m => m.JobTitle, ??How do I get Title enum values??)
<br>
<input type="submit />
}
我试图实现的DropDownListFor的输出如下所示: 请注意,选项值与枚举
的初始值相匹配<select name="JobTitle">
<option value="-1">Choose a Job Title</option>
<option value="111">Accountant</option>
<option value="222">Sales</option>
<option value="333">Production</option>
</select>
如何获取DropDownListFor&lt;&gt;帮助器根据模型的标题枚举创建一个select / option元素?
此外,是否可以使用DropDownListFor&lt;&gt;帮助者添加额外的(不是枚举的一部分)类似于上面示例中的“选择职位”选项?
答案 0 :(得分:3)
你可能会得到一个带有枚举值名称的String[]
并从中创建一个下拉列表。在视图模型中,添加类型为Titles
的属性SelectListItem
,并将枚举值和名称添加到该属性中。您可以通过System.Enum
类型获取名称和值。
var defaultItem = new SelectListItem();
defaultItem.Value = -1;
defaultItem.Text = "Choose a title";
defaultItem.Selected = true;
model.TitleSelectItems.add(defaultItem);
String[] names = System.Enum.GetNames(typeof(Title));
Int[] values = System.Enum.GetValues(typeof(Title));
for (int i = 0; i<names.Length; i++)
{
var item = new SelectListItem();
item.Text = names[i];
item.Value = values[i];
model.TitleSelectItems.Add(item);
}
这有点难看,但它会起作用。
答案 1 :(得分:3)
我偶然发现了StackO question/answer - 这不仅是我的问题完全重复,而answer given by Mike McLaughlin是我见过的使用DropdownListFor<>
Enums
的最佳解决方案}}。具体来说,迈克指出我们a solution that he found by Morgan Leroi
摩根的快速解决方案是:
@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States))))
但是,摩根已经制作了一个扩展,使得DropDownListFor<>
的实现更加紧凑。你可以download Morgan's Visual Studio Solution here.
那就是说,我认为我们应该关闭这个问题,因为它完全是重复的。
答案 2 :(得分:3)
这是解决方案
public enum Months
{
January=1,
February=2,
March=3,
April =4,
May=5,
June=6
}
public ActionResult Index()
{
ViewBag.Months = (from Months m in Enum.GetValues(typeof(Months))
select new SelectListItem { Text = m.ToString(), Value = Convert.ToUInt16(m).ToString() });
return View();
}
在DropDownList中添加ViewBag名称:
<%=Html.DropDownList("Months") %>
答案 3 :(得分:2)
以下是使用Html助手的方法:
<强>模型强>
public class Person
{
public string Name { get; set; }
public JobTitle Job { get; set; }
public enum JobTitle
{
Accountant = 111,
Sales = 222,
Production = 333
}
}
查看强>
@model MvcApplication1.Models.Person
@{
ViewBag.Title = "Index";
}
@using (Html.BeginForm())
{
@Html.TextBoxFor(n => n.Name)
@Html.DropDownListFor(c => c.Job, new[]{
new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Accountant.ToString(),
Value=((int)MvcApplication1.Models.Person.JobTitle.Accountant).ToString()}
,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Production.ToString(),
Value=((int)MvcApplication1.Models.Person.JobTitle.Production).ToString()}
,new SelectListItem() {Text = MvcApplication1.Models.Person.JobTitle.Sales.ToString(),
Value=((int)MvcApplication1.Models.Person.JobTitle.Sales).ToString()}}
, "Choose a Job Title")
}
HTML输出
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<form action="/" method="post">
<input id="Name" name="Name" type="text" value="" />
<select id="Job" name="Job">
<option value="">Choose a Job Title</option>
<option value="111">Accountant</option>
<option value="333">Production</option>
<option value="222">Sales</option>
</select>
</form>
</body>
</html>
答案 4 :(得分:2)
此处提供了封装的HTML Helper扩展程序:
http://www.spicelogic.com/Journal/ASP-NET-MVC-DropDownListFor-Html-Helper-Enum-5
源代码快照:
您可以从链接下载项目的完整源代码。
答案 5 :(得分:0)
我用这个扩展解决了它:
public static SelectList ToSelectListWithDefault<TEnum>(this TEnum enumObj, string defValue, string defText) where TEnum : IConvertible
{
var values = new List<SelectListItem>();
var defItem = new SelectListItem() { Value = defValue, Text = defText };
values.Add(defItem);
foreach (TEnum e in Enum.GetValues(typeof(TEnum)))
{
values.Add(new SelectListItem() { Value = e.ToInt16(null).ToString(), Text = e.ToString() });
}
return new SelectList(values, "Value", "Text", defItem);
}
(我在SO上找到了扩展,但没有默认值)