ModelState.AddModelError - मैं एक त्रुटि कैसे जोड़ सकता हूं जो किसी संपत्ति के लिए नहीं है?


188

मैं Create(FooViewModel fvm){...}यह देखने के लिए अपने डेटाबेस की जाँच कर रहा हूँ कि क्या fvm.prop1और fvm.prop2पहले से ही उस संयोजन में मौजूद है; यदि हां, तो मैं मॉडलस्टेट में एक त्रुटि जोड़ना चाहता हूं, फिर संपूर्ण दृश्य लौटाएं। मैंने कोशिश की:

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

... लेकिन मुझे त्रुटियों का कोई प्रदर्शन नहीं मिलता है Html.ValidationSummary, जो मुझे लगता है कि वे कहां दिखाई देंगे। मुझे यह संदेह है कि "मॉडल" सही कुंजी नहीं है, लेकिन मुझे कुछ भी नहीं मिल पाया है।


जवाबों:


328

मैं अंततः उस उपयोग के उदाहरण पर ठोकर खाई, जिसकी मैं तलाश कर रहा था - सामान्य रूप से मॉडल के लिए एक त्रुटि प्रदान करने के लिए, इसके गुणों में से एक के बजाय, जैसा कि आप कहते हैं:

ModelState.AddModelError(string key, string errorMessage);

लेकिन कुंजी के लिए एक खाली स्ट्रिंग का उपयोग करें:

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

त्रुटि संदेश स्वयं को उसी <%: Html.ValidationSummary() %>रूप में प्रस्तुत करेगा जैसा आप अपेक्षा करते हैं।


21
यह मामला मुझे यह सोचने पर मजबूर करता है: क्यों ModelState.AddError(errorMessage)या जैसी कोई विधि नहीं है ModelState.AddGlobalError(errorMessage)... यह सहज और आसान होगा यह पता लगाना कि किसी मॉडल के गुणों से संबंधित त्रुटि संदेश कैसे जोड़ना है।
रुबेन्स मारियाज़ो

@ रुबेंस: सच है, लेकिन आप आसानी से एक्सटेंशन विधियों के साथ ऐसी विधि जोड़ सकते हैं।
जॉनी 5

2
तुम भी त्रुटि का उपयोग कर प्रदर्शित कर सकते हैं@Html.ValidationMessage(string.Empty)
बेन फोस्टर

कुंजी आपके मॉडल को देखने के लिए बाध्य है - जिसमें त्रुटि है - बस स्पष्ट होना।
नीको

1
ValidationSummaryErrors(bool excludePropertyErrors)अधिभार सब सत्यापन त्रुटियों त्रुटियों को प्रदर्शित करेगा अगर इसके तर्क गलत या केवल गैर-संपत्ति-विशिष्ट है (key = "") अगर अपने तर्क सही है।
सनकैट २२

26

आप अपने मॉडल की किसी भी संपत्ति पर मॉडल की त्रुटि जोड़ सकते हैं, मेरा सुझाव है कि अगर नई संपत्ति बनाने से संबंधित कुछ भी नहीं है।

एक उदाहरण के रूप में, हम यह जांचते हैं कि क्या ईमेल पहले से ही डीबी में उपयोग में है और त्रुटि को ईमेल संपत्ति में जोड़ देता है, इसलिए जब मैं दृश्य वापस करता हूं, तो वे जानते हैं कि एक त्रुटि है और इसका उपयोग करके कैसे दिखाना है

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

तथा

ModelState.AddModelError("Email", Resources.EmailInUse);

1
मेरे मामले में यह उचित प्रतीत होता है - मैं यह देखने के लिए जाँच कर रहा हूं कि क्या col1 & col2 का एक विशेष संयोजन पहले से ही डेटाबेस में मौजूद है, इसलिए मेरे ViewModel पर IsDuplicateOfAnotherRow संपत्ति का होना सही नहीं लगता है। पता चला, आप अपने मॉडल में एक त्रुटि जोड़ सकते हैं - मेरा उत्तर देखें।
स्कॉट बेकर

1
वहाँ एक तरीका है कि एक नाजुक शाब्दिक स्ट्रिंग का उपयोग किए बिना AddModelError के लिए स्ट्रिंग "ईमेल" प्राप्त किया जाए? पसंद है (m=>m.email).SomeMagicToString()?
सांप

मुझे नहीं लगता कि, आपको जादू की स्ट्रिंग के साथ जाना है ... सबसे अच्छा नहीं है लेकिन फिर भी एक अच्छा समाधान है
विन्नी

4
nameofC # 6.0 में आने वाला ऑपरेटर इस मैजिक स्ट्रिंग समस्या को हल करता है। msdn.microsoft.com/en-us/magazine/dn802602.aspx
RJ Cuthbertson

3

स्ट्रिंग्स में मॉडल डॉट प्रॉपर्टी डालना मेरे लिए काम कर गया: ModelState.AddModelError("Item1.Month", "This is not a valid date");


2
यह वास्तव में आपके UI में एक अमान्य महीना दिखाएगा, लेकिन यह मूल समस्या को हल नहीं करता है।
स्कॉट बेकर

2
मूल समस्या समझ में नहीं आती है कि विधि में "कुंजी" क्या दर्शाती है। यह "कुंजी" कार्यों के बारे में कुछ प्रकाश डालता है, इसलिए यह जानना अच्छा है कि कुंजी को केवल एक संपत्ति का नाम नहीं होना चाहिए, लेकिन यह नेस्टेड संपत्तियों या विशेष मूल्य String.Empty को भी संदर्भित कर सकता है।
त्रिनको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.