2012-06-18 16 views
18

समस्याकैसे एक सूची

मैं क्षेत्रों है कि उपयोगकर्ता संपादित कर सकते हैं की एक सूची है में एक आइटम की एक ModelState कुंजी प्राप्त करने के लिए। जब मॉडल सबमिट किया जाता है तो मैं यह जांचना चाहता हूं कि यह आइटम मान्य हैं या नहीं। मैं डेटा नोटेशन का उपयोग नहीं कर सकता क्योंकि प्रत्येक फ़ील्ड में एक अलग सत्यापन प्रक्रिया होती है जिसे मैं रनटाइम तक नहीं जानता। अगर सत्यापन विफल रहता है तो मैं ModelState.AddModelError(string key, string error) का उपयोग करता हूं जहां कुंजी उस HTML तत्व का नाम है जिसे आप त्रुटि संदेश जोड़ना चाहते हैं। चूंकि खेतों की एक सूची है जो नाम है कि रेजर एचटीएमएल आइटम के लिए उत्पन्न करता है Fields[0].DisplayName जैसा है। मेरा प्रश्न दृश्य मॉडल से जेनरेट किए गए एचटीएमएल नाम की कुंजी प्राप्त करने का कोई तरीका या तरीका है?

का प्रयास किया गया समाधान

मैंने कोशिश की कोई भाग्य के साथ कुंजी के लिए toString() विधि। मैंने HtmlHelper कक्षा को भी देखा लेकिन मुझे कोई उपयोगी तरीका नहीं मिला।

कोड स्निपेट

देखें मॉडल

public class CreateFieldsModel 
{ 
    public TemplateCreateFieldsModel() 
    { 
     FreeFields = new List<FieldModel>(); 
    } 

    [HiddenInput(DisplayValue=false)] 
    public int ID { get; set; } 

    public IList<TemplateFieldModel> FreeFields { get; set; } 


    public class TemplateFieldModel 
    { 
     [Display(Name="Dispay Name")] 
     public string DisplayName { get; set; } 

     [Required] 
     [Display(Name="Field")] 
     public int FieldTypeID { get; set; } 
    } 
} 

नियंत्रक

public ActionResult CreateFields(CreateFieldsModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Where do I get the key from the view model? 
     ModelState.AddModelError(model.FreeFields[0], "Test Error"); 
     return View(model); 
    } 
} 

उत्तर

24

स्रोत कोड में चारों ओर खोदने के बाद मुझे समाधान मिला है। नामक एक कक्षा है जिसका प्रयोग क्षेत्र के लिए HTML नाम उत्पन्न करने के लिए किया जाता है जब EditorFor() कहा जाता है। ExpressionHelper कक्षा में GetExpressionText() नामक एक विधि है जो उस स्ट्रिंग को लौटाती है जो उस HTML तत्व का नाम है। यहाँ ... यह कैसे उपयोग करने के लिए है

for (int i = 0; i < model.FreeFields.Count(); i++) 
{ 
    //Generate the expression for the item 
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value; 
    //Get the name of our html input item 
    string key = ExpressionHelper.GetExpressionText(expression); 
    //Add an error message to that item 
    ModelState.AddModelError(key, "Error!"); 
} 

if (!ModelState.IsValid) 
{ 
    return View(model); 
} 
+4

यह अच्छा है लेकिन अभी एक और पोस्ट मिली है जो इस तर्क को एक अच्छी विस्तार विधि में लपेटती है: http://stackoverflow.com/a/12689563/1825109 – Michael12345

0

आप कुंजी (इनपुट तत्व का नाम) नियंत्रक आधारित अंदर फ्रेम करने के लिए है आप कैसे एफ प्रस्तुत कर रहे हैं रूप में ields।

पूर्व के लिए। यदि FreeFieldsCreateFieldsModel संग्रह में दूसरे आइटम की सत्यापन विफल हो जाती है तो आप इनपुट तत्व का नाम i.e. कुंजी को FreeFields[1].DisplayName के रूप में फ्रेम कर सकते हैं जहां सत्यापन त्रुटि मैप होने जा रही है।

जहां तक ​​मुझे पता है कि आप इसे आसानी से नियंत्रक से प्राप्त नहीं कर सकते हैं।

+0

तो शायद एक छिपी हुई फ़ील्ड जहां नाम कुछ निरंतर मूल्य और फ़ील्ड का मान नाम विशेषता मिल को छोड़कर EditorFor विधि के उत्पादन में हो रहा है? –