2010-06-13 16 views
13

में एनम से ड्रॉपडाउन सूचियों में चयनित आइटम क्षमा करें यदि यह एक डुप्लिकेट है, तो मेरी खोज कुछ भी नहीं हो गई।ASP.net एमवीसी

मैं निम्न विधि का उपयोग कर रहा enum प्रकार के लिए सूचियों ड्रॉप डाउन उत्पन्न करने के लिए (यहाँ से उठाया: http://addinit.com/?q=node/54):

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
{ 
    if (!type.IsEnum) 
     throw new ArgumentException("Type is not an enum."); 

    if(selected != null && selected.GetType() != type) 
     throw new ArgumentException("Selected object is not " + type.ToString()); 

    var enums = new List<SelectListItem>(); 
    foreach (int value in Enum.GetValues(type)) 
    { 
     var item = new SelectListItem(); 
     item.Value = value.ToString(); 
     item.Text = Enum.GetName(type, value); 

     if(selected != null) 
      item.Selected = (int)selected == value; 

     enums.Add(item); 
    } 

    return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, enums, "--Select--"); 
} 

यह ठीक काम कर रहा है एक बात को छोड़कर। यदि मैं ड्रॉपडाउन सूची को अपने मॉडल पर संपत्ति के समान नाम देता हूं तो चयनित मान ठीक से सेट नहीं होता है। मतलब यह काम करता है:

<%= Html.DropDownList("fam", typeof(EnumFamily), Model.Family)%> 

लेकिन यह नहीं करता है:

<%= Html.DropDownList("family", typeof(EnumFamily), Model.Family)%> 

क्योंकि मैं नियंत्रक विधि मैं करने के लिए पोस्ट कर रहा हूँ करने के लिए सीधे एक संपूर्ण वस्तु पारित करने के लिए कोशिश कर रहा हूँ, मैं करूंगा वास्तव में की तरह मॉडल पर संपत्ति के लिए नामित ड्रॉपडाउन सूची है। "दाएं" नाम का उपयोग करते समय, ड्रॉपडाउन सही ढंग से पोस्ट करता है, मैं बस चयनित मान सेट नहीं कर सकता।

मैं इस मामले को नहीं लगता कि लेकिन मैं मोनो पर MVC 1 चला रहा हूँ 2.6

संपादित करें: मैं सिर्फ खिड़कियों पर यह परीक्षण किया है, और यह नहीं है मैं एक ही व्यवहार

+0

मैंने वही व्यवहार देखा, और विभिन्न नामित ड्रॉप डाउन सूची का उपयोग करके चारों ओर काम किया। – Nate

उत्तर

14

है enum/बजाय के लिए पूर्णांक मूल्य का उपयोग नहीं कर प्रयास करें:

item.Value = value.ToString();

उपयोग:

item.Value = Enum.GetName(type, value);

imo क्या हो रहा है है यह स्वचालित रूप से मॉडल से मेल खाने के लिए ड्रॉप डाउन के चयनित मान को सेट करता है - इसके int मान के बजाय enum name का उपयोग करके। याद रखें कि व्यू इंजन न केवल पहले से चुने गए मूल्य को देखता है, न कि केवल पोस्ट किए गए फॉर्म में (मामलों में जब इसे पहले ही पोस्ट किया जा रहा है) लेकिन मॉडल + व्यूडेटा को दृश्य में पास किया जा रहा है। केवल अगर इसे वहां नहीं मिला है, तो यह आपके द्वारा निर्दिष्ट चुने गए मान का उपयोग करेगा।

+0

ऐसा लगता है कि यह केवल टिकट फ्रेडी है - बहुत बहुत धन्यवाद। काश मैं बक्षीस उच्च बना दिया था। मैंने वास्तव में सोचा कि यह enum मूल्य से बाध्यकारी होगा, लेकिन आखिरकार यह जानना अच्छा है कि क्या हो रहा है। अब मुझे वापस जाना होगा और मेरे द्वारा रखे गए सभी हैक्स को पूर्ववत करना होगा, हालांकि मुझे लगता है कि मुझे आप पर पागल होना चाहिए;) – AlexCuse

0

देख रहा हूँ काफी सही लगता है, लेकिन मैंने पाया कि यदि मैं {nameOfInputParameter} के साथ ड्रॉप डाउन सूची का नाम देता हूं। {propertyName} यह लोड करता है और सही ढंग से पोस्ट करता है। तो, अगर सवाल में प्रपत्र एक पद्धति के लिए पोस्टिंग हो रही थी "myModel" कहा जाता है प्रपत्र के मॉडल के रूप में एक ही प्रकार के परिवार के लिए लटकती इस तरह स्थापित किया जा सकता है की एक पैरामीटर लेने:

<%= Html.DropDownList("myModel.family", typeof(EnumFamily), Model.Family)%> 

यह एक आईडी के साथ renders myModel_family और myModel.family का नाम। मुझे यकीन नहीं है कि इस बारे में कैसा महसूस किया जाए, यह मेरे लिए थोड़ा सा लगता है। लेकिन ऐसा लगता है कि अब तक काम कर रहा है। हालांकि यह एक नई समस्या पेश करता है। अब आप बक्सें, आदि को प्रारंभ कर सकते हैं ... इसलिए की तरह:

<%= Html.TextBox("name") %> 

यह मान सही ढंग से लोड होगा, लेकिन आप एक पैरामीटर मान भी मान्यता प्राप्त नहीं हैं के रूप में "myModel" लेने नियंत्रक विधि पर पोस्ट जब प्रस्तुत किए जा रहे वस्तु का हिस्सा। तो हमें हमारे इनपुट नाम में पैरामीटर नाम शामिल करने की आवश्यकता है।

हालांकि, निम्नलिखित एक मूल्य के हल नहीं होती है, कम से कम डिफ़ॉल्ट मॉडल बांधने की मशीन का उपयोग कर (मैं अगर चारों ओर से खुदाई में वहाँ जा रहा है इस सवाल का सर्वश्रेष्ठ उत्तर धारण करने के लिए सोच रहा हूँ):

<%= Html.TextBox("myModel.name") %> 

तो आप ऐसा करने की जरूरत है:

<%= Html.TextBox("myModel.name", Model.Name) %> 

यह सब सुंदर सकल हो रही (विशेष रूप से जिन पन्नों पर मैं स्थितियों में, जहां मॉडल रिक्त है से निपटने के लिए सक्षम होना चाहिए पर) है।उम्मीद है कि किसी और एक बेहतर विचार :)

4

वास्तव में, यह समाधान है। इस सवाल में मेरा एक ही समाधान है।
ASP.NET MVC - Html.DropDownList - Value not set via ViewData.Model

public static string DropDownList(this HtmlHelper helper, string name, Type type, object selected) 
    { 
     if (!type.IsEnum) 
      throw new ArgumentException("Type is not an enum."); 

     if (selected != null && selected.GetType() != type) 
      throw new ArgumentException("Selected object is not " + type.ToString()); 

     var enums = new List<SelectListItem>(); 
     foreach (int value in Enum.GetValues(type)) 
     { 
      var item = new SelectListItem(); 
      item.Value = value.ToString(); 
      item.Text = Enum.GetName(type, value); 

      if (selected != null) 
       item.Selected = (int)selected == value; 

      enums.Add(item); 
     } 

     // set ViewData first 
     helper.ViewData[name] = enums; 

     // pass in "null" intentionally into the DropDownList extension method 
     return System.Web.Mvc.Html.SelectExtensions.DropDownList(helper, name, null, "--Select--"); 
    } 

का उपयोग item.Value = Enum.GetName(type, value); < विकल्प > मूल्यों Enum नाम के रूप में प्रदान करने के लिए ड्रॉप डाउन में आता है। मैं व्यक्तिगत रूप से पोस्टबैक के रूप में int मानों को पसंद करता हूं।

उम्मीद है कि यह मदद करता है।

+0

दिलचस्प - मैंने उस तरह व्यूडेटा का उपयोग नहीं किया। मुझे यकीन नहीं है कि मैं इस बिंदु पर उस मार्ग पर जाना चाहता हूं, लेकिन मैं वास्तव में उत्तर की सराहना करता हूं। यदि मैं वर्तमान दृष्टिकोण के साथ किसी भी समस्या में भाग लेता हूं तो मैं इसे आज़माकर सुनिश्चित कर दूंगा। – AlexCuse

+0

यह एक शानदार जवाब था, धन्यवाद! – loraderon

+0

यह कमाल है कि मैं हर जगह एक समाधान की तलाश में था – bman

संबंधित मुद्दे