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枚舉](的