2010-05-11 8 views
13

मैं JSON द्वारा लौटाए गए मॉडलस्टेट त्रुटियों को कैसे प्रदर्शित कर सकता हूं?जेसन द्वारा लौटाए जाने पर मॉडलस्टेट त्रुटियों को कैसे पढ़ा जाए?

मैं इस तरह कुछ करना चाहता हूँ:

if (!ValidateLogOn(Name, currentPassword)) 
    { 
     ModelState.AddModelError("_FORM", "Username or password is incorrect."); 

     //Return a json object to the javascript 
     return Json(new { ModelState }); 
    } 

क्या होना चाहिए ध्यान में रखते हुए मेरी कोड ModelState त्रुटियों पढ़ सकते हैं और उन्हें प्रदर्शित करने के लिए?

function createCategoryComplete(e) { 
    var obj = e.get_object(); 
    alert(obj.Values); 
} 
+0

यहां एक समाधान है: http://stackoverflow.com/questions/2845852/asp-net-mvc-how-to-convert-modelstate-errors-to-json –

उत्तर

-8

आप JSON लौट रहे हैं, तो आप ModelState का उपयोग नहीं कर सकते हैं:

ध्यान में रखते हुए मेरे वास्तविक कोड JSON मूल्यों को पढ़ने के लिए इस प्रकार है। जो कुछ भी दृश्य दृश्यों को JSON स्ट्रिंग के अंदर निहित किया जाना चाहिए। तो बजाय ModelState करने के लिए त्रुटि जोड़ने की आप इसे मॉडल आप serializing कर रहे हैं करने के लिए जोड़ सकते हैं:

public ActionResult Index() 
{ 
    return Json(new 
    { 
     errorControl = "_FORM", 
     errorMessage = "Username or password is incorrect.", 
     someOtherProperty = "some other value" 
    }); 
} 
+1

देखें नहीं कि मॉडलस्टेट क्यों नहीं कर सकता इस्तेमाल किया गया। जैसेमॉडल बाइंडर्स मॉडलस्टेट, एक्शन फ़िल्टर इत्यादि में त्रुटियां डाल सकते हैं; अगर हम मॉडलस्टेट उपयोगकर्ता का उपयोग नहीं करते हैं तो उन्हें उनके बारे में भी पता नहीं चलेगा। – queen3

+0

मॉडलस्टेट क्रमबद्ध नहीं करता है। मुझे एक परिसंचरण संदर्भ त्रुटि मिली। –

47

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

सर्वर साइड:

public static JsonResult JsonValidation(this ModelStateDictionary state) 
    { 
    return new JsonResult 
    { 
     Data = new 
      { 
       Tag = "ValidationError", 
       State = from e in state 
         where e.Value.Errors.Count > 0 
         select new 
         { 
         Name = e.Key, 
         Errors = e.Value.Errors.Select(x => x.ErrorMessage) 
          .Concat(e.Value.Errors.Where(x => x.Exception != null).Select(x => x.Exception.Message)) 
         } 
      } 
    }; 
    } 

    in action: 
    if (!ModelState.IsValid && Request.IsAjaxRequest()) 
     return ModelState.JsonValidation(); 

क्लाइंट साइड:

function getValidationSummary() { 
    var el = $(".validation-summary-errors"); 
    if (el.length == 0) { 
     $(".title-separator").after("<div><ul class='validation-summary-errors ui-state-error'></ul></div>"); 
     el = $(".validation-summary-errors"); 
    } 
    return el; 
} 

function getResponseValidationObject(response) { 
    if (response && response.Tag && response.Tag == "ValidationError") 
     return response; 
    return null; 
} 

function CheckValidationErrorResponse(response, form, summaryElement) { 
    var data = getResponseValidationObject(response); 
    if (!data) return; 

    var list = summaryElement || getValidationSummary(); 
    list.html(''); 
    $.each(data.State, function(i, item) { 
     list.append("<li>" + item.Errors.join("</li><li>") + "</li>"); 
     if (form && item.Name.length > 0) 
     $(form).find("*[name='" + item.Name + "']").addClass("ui-state-error"); 
    }); 
} 

$.ajax(... function(response) { 
    CheckValidationErrorResponse(xhr.responseText); }); 
+2

अच्छी तरह से किया गया! आपके द्वारा प्रदान किया गया कोड भी अत्यंत पोर्टेबल है। बदलने के लिए मुझे केवल एक चीज "$ (" शीर्षक-विभाजक ")" मेरे डोम से मेल खाने के लिए "थी। –

+0

आप इस पर क्या सेट करते हैं: सारांश एलिमेंट ?? मैं आपके कोड में कहीं भी नहीं देखता हूं। – leora

+1

सारांश सत्यापन को सत्यापित किया जाता है यदि मैं गैर-डिफ़ॉल्ट स्थान में त्रुटियों को प्रदर्शित करना चाहता हूं - उदाहरण के लिए CheckValidationErrorResponse पर भेजा गया है jqGrid संपादन फॉर्म में। यह उल/div/etc का एक jquery तत्व/चयनकर्ता है जिसकी सामग्री त्रुटियों के साथ ली टैग के साथ प्रतिस्थापित की जाएगी। ऊपर दिए गए मेरे कोड में आप $ .ajax कॉलबैक में CheckValidationErrorResponse पास करेंगे। – queen3

2

इस queen3 के क्लाइंट पक्ष कोड के लिए एक छोटे से ट्वीक जो विशिष्ट सत्यापन संदेश संभालती है, और MVC3 द्वारा बनाई गई है कि एक समान दस्तावेज़ बनाता है :

function getValidationSummary() { 
    var $el = $(".validation-summary-errors > ul"); 
    if ($el.length == 0) { 
     $el = $("<div class='validation-summary-errors'><ul></ul></div>") 
       .hide() 
       .insertBefore('fieldset:first') 
       .find('ul'); 
    } 
    return $el; 
} 
function getResponseValidationObject(response) { 
    if (response && response.Tag && response.Tag == "ValidationError") 
     return response; 
    return null; 
} 
function isValidationErrorResponse(response, form, summaryElement) { 
    var $list, 
     data = getResponseValidationObject(response); 
    if (!data) return false; 
    $list = summaryElement || getValidationSummary(); 
    $list.html(''); 
    $.each(data.State, function (i, item) { 
     var $val, lblTxt, errorList =""; 
     if (item.Name) { 
      $val = $(".field-validation-valid,.field-validation-error") 
         .first("[data-valmsg-for=" + item.Name + "]") 
         .removeClass("field-validation-valid") 
         .addClass("field-validation-error"); 
      $("input[name=" + item.Name + "]").addClass("input-validation-error") 
      lblTxt = $("label[for=" + item.Name + "]").text(); 
      if (lblTxt) { lblTxt += ": "; } 
     } 
     if ($val.length) { 
      $val.text(item.Errors.shift()); 
      if (!item.Errors.length) { return; } 
     } 
     $.each(item.Errors, function (c,val) { 
      errorList += "<li>" + lblTxt + val + "</li>"; 
     }); 
     $list.append(errorList); 
    }); 
    if ($list.find("li:first").length) {$list.closest("div").show(); } 
    return true; 
} 
+0

धन्यवाद ब्रेंट। सुझावों का जोड़ा - $। सबसे पहले() तर्क स्वीकार नहीं करता है, यह $ .filter() होना चाहिए? फिर $ ("इनपुट [नाम = ...]") चयन, textarea, आदि को छोड़कर - $ ("* [name = ...]") में बदला जा सकता है? – DGreen

1

ब्रेंट के उत्तर में कुछ संशोधन के साथ कोड के लिए नीचे देखें। CheckValidationErrorResponse प्रमाणीकरण सारांश की तलाश करता है चाहे वह वैध या अमान्य स्थिति में है, और यदि नहीं मिला तो उसे सम्मिलित करता है। यदि प्रतिक्रिया में सत्यापन त्रुटियां पाई जाती हैं, तो यह सारांश में सत्यापन-सारांश-त्रुटियों की कक्षा लागू करती है, अन्यथा यह सत्यापन-सारांश-मान्य लागू होती है। यह मानता है कि सारांश की दृश्यता को नियंत्रित करने के लिए सीएसएस मौजूद है।

कोड फ़ील्ड-सत्यापन-त्रुटि के मौजूदा उदाहरणों को साफ़ करता है, और प्रतिक्रिया में मिली त्रुटियों के लिए उन्हें पुनः लागू करता है।

function getValidationSummary(form) { 
    var $summ = $(form).find('*[data-valmsg-summary="true"]'); 

    if ($summ.length == 0) 
    { 
    $summ = $('<div class="validation-summary-valid" data-valmsg-summary="true"><ul></ul></div>'); 
     $summ.appendTo(form); 
    } 

    return $summ; 
} 

function getValidationList(summary) { 
    var $list = $(summary).children('ul'); 

    if ($list.length == 0) { 
     $list = $('<ul></ul>'); 
     $list.appendTo(summary); 
    } 

    return $list; 
} 

function getResponseValidationErrors(data) { 
    if (data && data.ModelErrors && data.ModelErrors.length > 0) 
     return data.ModelErrors; 
    return null; 
} 

function CheckValidationErrorResponse(data, form, summaryElement) { 
    var errors = getResponseValidationErrors(data); 
    var $summ = summaryElement || getValidationSummary(form); 
    var $list = getValidationList($summ); 

    $list.html(''); 

    $(form).find(".field-validation-error") 
      .removeClass("field-validation-error") 
      .addClass("field-validation-valid"); 

    if (!errors) 
    { 
     $summ.removeClass('validation-summary-errors').addClass('validation-summary-valid'); 
     return false; 
    } 

    $.each(errors, function (i, item) { 
     var $val, $input, errorList = ""; 
     if (item.Name) { 
      $val = $(form).find(".field-validation-valid, .field-validation-error") 
          .filter("[data-valmsg-for=" + item.Name + "]") 
          .removeClass("field-validation-valid") 
          .addClass("field-validation-error"); 

      $input = $(form).find("*[name='" + item.Name + "']"); 

      if (!$input.is(":hidden") && !$val.length) 
      { 
       $input.parent().append("<span class='field-validation-error' data-valmsg-for='" + item.Name + "' data-valmsg-replace='false'>*</span>"); 
      } 

      $input.addClass("input-validation-error"); 
     } 

     $.each(item.Errors, function (c, err) { 
      errorList += "<li>" + err + "</li>"; 
     }); 

     $list.append(errorList); 
    }); 

    $summ.removeClass('validation-summary-valid').addClass('validation-summary-errors'); 
    return true; 
} 
3

क्यों ग्राहक के लिए मूल ModelState वस्तु लौटने के लिए, और उसके बाद jQuery का उपयोग मूल्यों को पढ़ने के लिए नहीं। मेरे लिए यह बहुत सरल लग रहा है, और आम डेटा संरचना (.net के ModelState)

सी # का उपयोग करता है:

return Json(ModelState); 

js:

var message = ""; 
if (e.response.length > 0) { 
    $.each(e.response, function(i, fieldItem) { 
     $.each(fieldItem.Value.Errors, function(j, errItem) { 
      message += errItem.ErrorMessage; 
     }); 
     message += "\n"; 
    }); 
    alert(message); 
} 
0

सी #

public class ValidateModelAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      if (actionContext.ModelState.IsValid == false) 
      { 
       actionContext.Response = actionContext.Request.CreateErrorResponse(
        HttpStatusCode.BadRequest, actionContext.ModelState); 
      } 
     } 
    } 

जावास्क्रिप्ट

$.ajax({ 
     type: "GET", 
     url: "/api/xxxxx", 
     async: 'false', 
     error: function (xhr, status, err) { 
      if (xhr.status == 400) { 
       DisplayModelStateErrors(xhr.responseJSON.ModelState); 
      } 
     }, 
.... 


function DisplayModelStateErrors(modelState) { 
    var message = ""; 
    var propStrings = Object.keys(modelState); 

    $.each(propStrings, function (i, propString) { 
     var propErrors = modelState[propString]; 
     $.each(propErrors, function (j, propError) { 
      message += propError; 
     }); 
     message += "\n"; 
    }); 

    alert(message); 
}; 
संबंधित मुद्दे