5

मेरी MVC 3 उस्तरा एप्लिकेशन में साथ MVC एचटीएमएल हेल्पर .DropDownListFor <> का उपयोग कैसे करें, मैं एक enum के साथ एक मॉडल ..एक Enum

मॉडल उदाहरण है:

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 फ़ॉर्म का निर्माण करना चाहते हैं ...

देखें उदाहरण:

@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 < कैसे मिलता है> आधारित पर एक का चयन/विकल्प तत्व बनाने के लिए सहायक enum का प्रारंभ मान से मेल मॉडल का शीर्षक enum?

साथ ही, क्या ड्रॉपडाउन लिस्टफ़ोर <> सहायक उदाहरण है कि उपरोक्त उदाहरण में "एक नौकरी शीर्षक चुनें" विकल्प के समान अतिरिक्त (जो enum का हिस्सा नहीं है) जोड़ने के लिए सहायक है?

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/4656758/mvc3 -razor-dropdownlistfor-enums) – Jed

उत्तर

3

आप संभवतः String[] एनम मानों के नामों के साथ प्राप्त कर सकते हैं और उस से एक ड्रॉपडाउन बना सकते हैं। अपने दृश्य मॉडल में, TitlesSelectListItem प्रकार की संपत्ति जोड़ें और उसमें enum मान और नाम जोड़ें। आप 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

यहाँ एक तरह से एचटीएमएल सहायकों का उपयोग कर रहा है:

मॉडल

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

एचटीएमएल आउटपुट

<!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 सबसे अच्छा समाधान मैं Enums साथ DropdownListFor<> प्रयोग करने के लिए देखा है है। विशेष रूप से, माइक हमें बताते हैं करने के लिए a solution that he found by Morgan Leroi

मॉर्गन त्वरित समाधान है:

@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States)))) 

लेकिन, मॉर्गन एक एक्सटेंशन और भी अधिक कॉम्पैक्ट enums साथ DropDownListFor<> के कार्यान्वयन करता है कि बना दिया है। आप download Morgan's Visual Studio Solution here.

ने कहा, मुझे लगता है कि हमें इस प्रश्न को बंद करना चाहिए क्योंकि यह एक सटीक डुप्लिकेट है।

+1

डिफ़ॉल्ट आइटम के बारे में क्या? – r03

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

(मैं इतने पर विस्तार पाया है, लेकिन डिफ़ॉल्ट मान के बिना)

2

एक समझाया एचटीएमएल हेल्पर एक्सटेंशन यहाँ उपलब्ध है:

http://www.spicelogic.com/Journal/ASP-NET-MVC-DropDownListFor-Html-Helper-Enum-5

स्रोत कोड स्नैपशॉट:

enter image description here

आप लिंक से परियोजना का पूरा स्रोत कोड डाउनलोड कर सकते हैं।

+1

मैंने इस प्रश्न का भी उत्तर दिया: http://stackoverflow.com/questions/388483/how-do-you-create-a-dropdownlist-from-an-enum-in-asp-net-mvc/16089319#16089319 –

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 Enums] (की