5

在我的MVC 3剃须刀的应用程序,我有一个枚举模型..如何使用MVC HTML辅助.DropDownListFor <>与枚举

型号示例:

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 /> 
} 

下拉的输出ListFor,我想实现是这样的: 注选项值

<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 <>助手来创建一个选择/选项元素的基础上匹配枚举的初始值模型的标题枚举?

此外,是否有可能让DropDownListFor <>助手添加一个额外的(不是枚举的一部分)类似于上面的例子中的“选择职位”选项?

+0

可能重复http://stackoverflow.com/questions/4656758/mvc3 -razor-dropdownlistfor-enums) – Jed 2012-03-02 07:46:08

回答

3

你可能会得到一个String[]与枚举值的名称,并创建一个下拉列表。在您的视图模型中,添加SelectListItem类型的属性Titles,并向其添加枚举值和名称。您可以通过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); 
} 

这是一种丑陋的,但它会工作。

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> 
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.

这就是说,我认为我们应该关闭这个问题,因为它是一个确切的副本。

+1

默认项目呢? – r03 2013-04-02 11:09:27

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); 
} 

(我发现这样的扩展,但没有默认值)

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") %> 
[MVC3剃刀DropDownListFor枚举](的