2011-03-06 19 views
43

मेरे पास यह नियंत्रक मेरे नियंत्रक में है।यदि ModelState.IsValid विफल रहता है तो त्रुटि संदेश प्राप्त करें?

[HttpPost] 
public ActionResult Edit(EmployeesViewModel viewModel) 
{ 
    Employee employee = GetEmployee(viewModel.EmployeeId); 
    TryUpdateModel(employee); 

    if (ModelState.IsValid) 
    { 
     SaveEmployee(employee); 
     TempData["message"] = "Employee has been saved."; 
     return RedirectToAction("Details", new { id = employee.EmployeeID }); 
    } 

    return View(viewModel); // validation error, so redisplay same view 
} 

यह नाकाम रहने रखता है, ModelState.IsValid झूठी लौटने और देखने redisplaying रहता है। लेकिन मुझे नहीं पता कि त्रुटि क्या है।

क्या त्रुटि प्राप्त करने और उपयोगकर्ता को इसे फिर से चलाने का कोई तरीका है?

उत्तर

24

मॉडल की विशिष्ट संपत्ति के लिए संदेश दिखाने के लिए आप सभी त्रुटि संदेशों को दिखाने के लिए Html.ValidationSummary() का उपयोग कर Html.ValidationSummary() का उपयोग कर अपने कार्य में विशेष कुछ भी किए बिना अपने विचार में ऐसा कर सकते हैं।

आप अभी भी अपने क्रिया या नियंत्रक के भीतर से त्रुटियों को देखने की जरूरत है, ModelState.Errors संपत्ति

+1

कोई मॉडलस्टेट नहीं है। संपत्ति संपत्ति ?! – niico

+0

@niico मुझे लगता है कि उसका मतलब 'मॉडलस्टेट' प्रकार की संपत्ति है, जबकि नियंत्रक। मॉडलस्टेट गुण मॉडलस्टेट डिक्शनरी प्रकार है। – devlord

0

मुझे पता नहीं है देखने अगर यह आपकी समस्या है, लेकिन यदि आप किसी उपयोगकर्ता को जोड़ने और फिर का नाम बदलने के अपने एप्लिकेशन, वह उपयोगकर्ता डेटाबेस (बेशक) में रहेगा, लेकिन अमान्य होगा (जो सही व्यवहार है)। हालांकि, इस प्रकार की विफलता के लिए कोई त्रुटि नहीं जोड़ा जाएगा। त्रुटि सूची खाली है, लेकिन ModelState.IsValid लॉगिन के लिए झूठी वापसी करेगा।

86

इस

if (ModelState.IsValid) 
{ 
    //go on as normal 
} 
else 
{ 
    var errors = ModelState.Select(x => x.Value.Errors) 
          .Where(y=>y.Count>0) 
          .ToList(); 
} 

त्रुटियों सभी त्रुटियों की एक सूची होगा की कोशिश करो।

+1

सही उत्तर। बहुत बहुत धन्यवाद! –

45

आप एक ही त्रुटि संदेश स्ट्रिंग कि ModelState त्रुटि संदेश होता है आप एक ही सूची में त्रुटियों समतल SelectMany उपयोग कर सकते हैं उत्पन्न करने के लिए देख रहे हैं:

if (!ModelState.IsValid) 
{ 
    var message = string.Join(" | ", ModelState.Values 
     .SelectMany(v => v.Errors) 
     .Select(e => e.ErrorMessage)); 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 
+7

कभी-कभी 'त्रुटि संदेश' प्रदान नहीं किया जाता है, उदा। यदि आवश्यक 'डेटटाइम' फ़ील्ड सेट नहीं है। इस मामले में, अपवाद संदेश की तलाश करें, उदा। 'E.Exception.Message'। – WhatIsHeDoing

1

मॉडल राज्य मान्य & नहीं है, तो त्रुटि स्क्रीन पर नहीं देखी जा सकती है क्योंकि आपका नियंत्रण ढह गया एग्रीजन में है, तो आप HttpStatusCode को वापस कर सकते हैं ताकि वास्तविक त्रुटि संदेश दिखाया जा सके यदि आप F12 करते हैं। इसके अलावा आप इस त्रुटि को ELMAH त्रुटि लॉग में लॉग कर सकते हैं। नीचे कोड

if (!ModelState.IsValid) 
{ 
       var message = string.Join(" | ", ModelState.Values 
              .SelectMany(v => v.Errors) 
              .Select(e => e.ErrorMessage)); 

       //Log This exception to ELMAH: 
       Exception exception = new Exception(message.ToString()); 
       Elmah.ErrorSignal.FromCurrentContext().Raise(exception); 

       //Return Status Code: 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 

लेकिन कृपया ध्यान दें कि यह कोड सभी सत्यापन त्रुटियों को लॉग करेगा। तो इसका उपयोग तभी किया जाना चाहिए जब ऐसी स्थिति उत्पन्न होती है जहां आप स्क्रीन पर त्रुटियों को नहीं देख सकते हैं।

0

ठीक चेक और जोड़े में देखें में:

  1. अपने कोड में ModelState लाइन पर एक ब्रेकपाइंट करो
  2. अपनी दृश्य करने के लिए अपने मॉडल राज्य जोड़े
  3. ModelState विस्तृत "मान"
  4. मूल्यों का विस्तार करें "परिणाम देखें"

अब आप मूल्य के अंत में इसकी सत्यापन स्थिति के साथ सभी सबकी की एक सूची देख सकते हैं।

तो अमान्य मूल्य के लिए खोजें।

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