2012-10-02 5 views
11

मैं एक निश्चित दृश्य मॉडल संपत्ति के लिए क्लाइंट-साइड और सर्वर-साइड सत्यापन विकसित कर रहा हूं।सत्यापन मैसेज AddModelError (कुंजी, संदेश) के साथ एक साथ। कुंजी क्या है?

.cshtml फ़ाइल में मैं इस डाल: व्यापार सत्यापन के लिए नियंत्रक में

@Html.DropDownListFor(model => model.EntityType.ParentId, Model.ParentTypeList, "") 
@Html.ValidationMessageFor(model => model.EntityType.ParentId) 

catch (BusinessException e) 
{ 
    ModelState.AddModelError("EntityType.ParentId", Messages.CircularReference); 
} 

की उम्मीद के रूप में ऊपर काम करता है: एक अपवाद पकड़ा जाता है, तो संदेश के पास दिखाई देता ड्रॉपडाउन सूची।

हालांकि, मुझे लगता है कि यह तरीका बहुत ही सुरुचिपूर्ण नहीं है। cshtml में, मैं सत्यापन के बारे में सभी आवश्यक जानकारी उत्पन्न करने के लिए एक विधि का उपयोग करता हूं। नियंत्रक में, मुझे सटीक कुंजी स्ट्रिंग जाननी चाहिए और इसका उपयोग करना चाहिए।

क्या ऐसा करने का कोई बेहतर तरीका नहीं है?

+0

इस कड़ी में कुछ अतिरिक्त प्रदान करता है अंतर्दृष्टि और एक स्ट्रिंग के रूप में सीधे कुंजी का संदर्भ नहीं देने का एक तरीका है: एक अभिव्यक्ति के रूप में: http://stackoverflow.com/questions/11090445/how-to-get-a-modelstate-key-of-an-item-in- एक सूची एक और resour heres सीई जो अभिव्यक्ति कुंजी के लिए एक रैपर विधि प्रदान करता है http://stackoverflow.com/questions/8793799/get-reference-to-object-from-c-sharp-expression – bUKaneer

उत्तर

21

आप एक विस्तार विधि है कि एक स्ट्रिंग के बजाय कुंजी के लिए एक लैम्ब्डा अभिव्यक्ति ले जाएगा लिख ​​सकते हैं:

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel, TProperty>(
     this ModelStateDictionary modelState, 
     Expression<Func<TModel, TProperty>> ex, 
     string message 
    ) 
    { 
     var key = ExpressionHelper.GetExpressionText(ex); 
     modelState.AddModelError(key, message); 
    } 
} 

और उसके बाद इस विधि का उपयोग:

catch (BusinessException e) 
{ 
    ModelState.AddModelError<MyViewModel, int>(
     x => x.EntityType.ParentId, 
     Messages.CircularReference 
    ); 
} 
+0

धन्यवाद। पूरी तरह से काम करता है –

+0

पुस्तकालय में क्यों नहीं है? – UserControl

+0

@UserControl, क्योंकि सब कुछ ढांचे का हिस्सा नहीं हो सकता है। एक सुविधा के लिए जरूरतों के ढांचे का हिस्सा बनने के लिए, लिखित, परीक्षण और दस्तावेज होने के लिए। कभी-कभी आपको यह निर्णय लेने की आवश्यकता होती है कि रिलीज में कौन सी सुविधाएं इसे बनाएगी, अन्यथा आप कभी भी रिलीज़ नहीं कर पाएंगे :-) तो माइक्रोसॉफ्ट को इस सुविधा को कार्यान्वित करने, परीक्षण करने और दस्तावेज करने का समय नहीं मिला। यही कारण है कि यह पुस्तकालय का हिस्सा नहीं है। –

0

आप मान्यता चाहते हो क्लाइंट और सर्वर दोनों पक्षों पर और आप एक सुरुचिपूर्ण समाधान की तलाश में हैं तो कस्टम ValidationAttribute क्यों बना सकते हैं।

4

मैं @Darin Dimitrov समाधान का पालन करें, लेकिन मैं <MyViewModel, int> तो मैं कुछ अलग तरह से इस्तेमाल किया बचना चाहते हैं लेकिन उसके लिए आपको MyViewModel object variable.

public static class ModelStateExtensions 
{ 
    public static void AddModelError<TModel, TProperty>(this TModel source,   
                Expression<Func<TModel, TProperty>> ex, 
                string message, 
                ModelStateDictionary modelState) 
    { 
     var key = System.Web.Mvc.ExpressionHelper.GetExpressionText(ex); 
     modelState.AddModelError(key, message); 
    } 
} 

का उपयोग कैसे की जरूरत है:

catch (BusinessException e) 
{ 
    objMyViewModel.AddModelError(x => x.EntityType.ParentId, 
           Messages.CircularReference, 
           ModelState); 
} 
+4

मेरे लिए, अधिक सहज ज्ञान युक्त होगा विस्तार विधि हस्ताक्षर: 'AddModelError (यह मॉडलस्टेटेक्स मॉडलस्टेट, टीएमओडेल मॉडल, अभिव्यक्ति > ex, string message) '। इस तरह आप इसका उपयोग 'ModelState.AddModelError (मॉडल, x => x.Email, "अमान्य ईमेल") जैसे कर सकते हैं); ' – benmccallum

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