2009-12-10 13 views
9

यह previous question का अनुवर्ती है जो कि मैंने क्लाइंट को एक त्रुटि वापस करने के बारे में पहले बताया था, लेकिन मॉडलस्टेट से संबंधित है।एएसपी.NET एमवीसी में, मॉडलस्टेट को AJAX अद्यतन के साथ उपयोग किया जा सकता है?

क्या किसी ने भी नेरड डिनर दृष्टिकोण का उपयोग किया है, लेकिन अजाक्स के साथ? तो बेवकूफ रात्रिभोज एक अद्यतन करता है।

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(int id, FormCollection formValues) 
{ 
    Dinner dinner = dinnerRepository.GetDinner(id); 
    try 
    { 
     UpdateModel(dinner); 
     dinnerRepository.Save(); 
     return RedirectToAction("Details", new { id=dinner.DinnerID }); 
    } 
    catch 
    { 
     foreach (var issue in dinner.GetRuleViolations()) { 
     ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
    } 
     return View(dinner); 
    } 
} 

jQuery $ .ajax

function hijack(form, callback, errorFunction, format) { 
    $.ajax({ 
     url: form.action, 
     type: form.method, 
     dataType: format, 
     data: $(form).serialize(), 
     success: callback, 
     error: function(xhr, textStatus, errorThrown) { 
      errorFunction(xhr, textStatus, errorThrown); 
     } 
    }); 
} 

अजाक्स, नियंत्रक की "कोशिश" भाग

try 
{ 
    UpdateModel(dinner); 
    dinnerRepository.Save(); 
    return PartialView("PartialDetails", new { id=dinner.DinnerID }); 
} 

, लेकिन आप पकड़ भाग के बारे में क्या करते हो हो जाता है का उपयोग करना?

एक साधारण त्रुटि हैंडलिंग समाधान वापस भेजने के लिए एक त्रुटि

catch(Exception ex) 
{ 
    Response.StatusCode = 500;     
    return Content("An Error occured."); 
    //throw ex; 
} 

होगा, लेकिन है कि MVC में निर्मित मजबूत modelstate के माध्यम से पास नहीं। मैंने कई विकल्पों के बारे में सोचा, लेकिन मुझे वास्तव में 2 चीजें चाहिए:

  1. मैं चाहता हूं कि jQuery की त्रुटि विशेषता में त्रुटि को संभाला जाए।
  2. मैं जितना संभव हो एएसपी.NET एमवीसी सत्यापन तर्क में निर्मित करना चाहता हूं।

क्या यह संभव है? यदि नहीं, तो आप किस सर्वोत्तम विकल्प के बारे में जानते हैं?

बहुत धन्यवाद।

अद्यतन मैंने इसे अभी तक उत्तर के रूप में चिह्नित नहीं किया है, क्योंकि मैंने अभी तक लागू नहीं किया है जो मुझे लगता है कि मुझे सबसे अच्छा काम करेगा।

मैंने फैसला किया है कि मुझे वास्तव में सफलता पसंद नहीं है => ताज़ा सूची भेजें, विफलता => त्रुटि संदेश दृष्टिकोण जो मैं ले रहा था। मैंने कॉल की संख्या को कम करने के लिए ऐसा किया, लेकिन एक ताज़ा सूची वास्तव में पृष्ठ पर सेट की जा रही है। दोनों को करने के लिए कोशिश कर रहे हैं पॉपअप को अपने समग्र पृष्ठ पर कसकर बांधता है।

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

मुझे अभी भी यकीन नहीं है कि मैं सर्वर-साइड सत्यापन को कितना अच्छा/नापसंद करता हूं और मैं क्लाइंट-साइड केवल सत्यापन के साथ जाने पर विचार कर रहा हूं। जबकि सर्वर साइड सत्यापन क्लीन लेयरिंग की तरह दिखता है, इसमें भी कई समस्याएं हैं, जिनमें

1) यह शुरुआत के बजाय अंत में गुणवत्ता जांच रखता है। विनिर्माण के लिए एक समानता एक ऐसी कार होगी जो लेन-देन पर आने पर जांच की जाती है, बल्कि उस प्रक्रिया के बिंदुओं पर जहां इसे बनाया जा रहा है।
2) यह अजाक्स के इरादे का उल्लंघन करता है। अजाक्स सिर्फ अतुल्यकालिक घटनाओं को भेजने के बारे में नहीं है, यह केवल वही चीज़ भेजने के बारे में है जो मुझे चाहिए और केवल वही प्राप्त करना जो मुझे चाहिए। त्रुटि विवरण प्रदान करने के लिए पूरे मॉडलस्टेट को वापस भेजना अजाक्स के साथ नहीं लगता है।

मैं जो करने के बारे में सोच रहा हूं वह क्लाइंट-साइड केवल सत्यापन है, लेकिन क्लाइंट को यह बताने के लिए कि सर्वर कोड और कस्टम व्यूमोडेल का उपयोग क्लाइंट को गतिशील रूप से उन सत्यापन नियमों को कैसे बनाया जाए।

मुझे यह भी संदेह है कि आयरनआरबी या आयरनपीथन जैसी गतिशील भाषा इन समस्याओं को हल करने के लिए एक और अधिक शानदार तरीका प्रदान कर सकती है, लेकिन इससे पहले कि मैं उस संभावना को देख सकूं, यह थोड़ा लंबा हो सकता है।

+0

अच्छी तरह से मुझे लगता है कि यह वास्तव में परिदृश्य पर निर्भर करता है, अगर 2 अनुरोध करना कोई समस्या नहीं है तो मैं इसके लिए जाऊंगा।व्यक्तिगत रूप से क्लाइंट साइड पर जावास्क्रिप्ट के साथ बहुत से सत्यापन करना कुछ ऐसा नहीं है जिसे मैं प्यार करता हूं (मुझे नहीं पता कि क्यों, लेकिन मुझे कुछ ऐसा लगता है जो बहुत भरोसेमंद/सुरक्षित/समान रूप से लागू नहीं होता है (इस में एक jquery दिन को बचाता है), विशेष रूप से क्योंकि कभी-कभी आप क्लाइंट साइड पर सभी मान्यताओं को नहीं कर सकते हैं, आपको किसी प्रकार की अलग-अलग साइड चेक का उपयोग करना चाहिए, जैसे कि (यह इकाई पहले से ही डीबी में मौजूद है?), और जेएस अक्षम ग्राहकों का समर्थन करें, लेकिन जैसा कि मैंने शुरुआत में कहा था परिदृश्य पर निर्भर करता है। – JOBG

+0

मैं मानता हूं कि आप क्लाइंट पक्ष पर सभी सत्यापन नहीं कर सकते हैं, ऐसा लगता है कि सत्यापन फ्रेमवर्क मुख्य रूप से फ़ील्ड त्रुटियों (बहुत लंबा, तारीख नहीं, आदि) के लिए तैयार है। कम से कम उदाहरणों में मैंने देखा है। जब आप उपयोगकर्ता इनपुट की जांच कर रहे हैं, तो जावास्क्रिप्ट जांच करने के लिए उचित जगह लगता है। – John

+0

मैंने एक के बजाय 2 कॉल करने के बारे में अपने निर्णय की पुष्टि की है, क्योंकि यह इसके नीचे पृष्ठ दृश्य से विवरण आंशिक दृश्य जोड़ता है। मैं चाहता हूं कि पॉपअप पृष्ठ दृश्य पर वापस कहें "मैं बंद हूं", लेकिन पृष्ठ दृश्य क्या करने जा रहा है इसके बारे में कुछ भी नहीं पता। jQuery को बिना किसी प्रयास के इसे संभव बनाना चाहिए। इससे मुझे चिंता करने में मदद मिलती है कि मेरे विवरण में परिवर्तन आंशिक दृश्य पृष्ठ को प्रभावित करेगा और इसके विपरीत। – John

उत्तर

4

यदि मैं सही समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, तो मेरा पहला जवाब नहीं होगा, आप मॉडल स्थिति का उपयोग नहीं कर सकते क्योंकि यह अजाक्स अनुरोध है। शायद तुम ModelState व्यवहार का अनुकरण कर सकते हैं, त्रुटियों को प्रदर्शित करने के:

  1. एक List<KeyValuePair<string,string>> (संपत्ति, संदेश) पासिंग JSON द्वारा (यह पारित करने के लिए modelErrors नई संरचना के लिए modelState फार्म की आवश्यकता होगी) और कर जेएस/jQuery द्वारा एक सत्यापन सारांश का HTML निर्माण (जो मुझे लगता है कि समाधान को खत्म करने पर है)।

  2. यदि आप सर्वर पर जा रहे हैं, और कोई त्रुटि है तो Html.ValidationSummary() का आंशिक प्रस्तुत करें, इसे JSON के माध्यम से पास करें और इसे फ़ॉर्म में प्रीपेड करें। अगर सबकुछ ठीक था, तो केवल आंशिक विवरण देखें और वास्तविक सामग्री को प्रतिस्थापित करें। इसके लिए किसी प्रकार का स्टेटस पैरामीटर की आवश्यकता होगी ताकि आपको पता चल सके कि AJAX कॉलबैक पर सर्वर से क्या आ रहा है।

संपादित करें: यह अंतिम विकल्प, अच्छा है, लेकिन मुश्किल लगता है क्योंकि आप JSONResult द्वारा एक स्ट्रिंग के रूप में एक आंशिक दृश्य वापस जाने के लिए की आवश्यकता होगी, यहाँ एक सवाल और के बारे में है कि हैक Render a view as a string समाधान है।

व्यक्तिगत रूप से, मुझे नहीं लगता कि त्रुटि विशेषता का उपयोग करने से कोई भी अच्छा काम करेगा, मैं इसे टाइमआउट त्रुटियों और सर्वर अपवादों जैसी बहुत विशिष्ट परिस्थितियों में उपयोग करता हूं, ऐप अपवाद नहीं।

संपादित करें: JSON

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Edit(int id, FormCollection formValues) 
     { 
      Dinner dinner = dinnerRepository.GetDinner(id); 
      try 
      { 
       UpdateModel(dinner); 
       dinnerRepository.Save(); 
       return Json(new 
       { 
        result = "success", 
        html = this.RenderToString("PartialDetails", dinner) 
       }); 

      } 
      catch 
      { 
       foreach (var issue in dinner.GetRuleViolations()) 
       { 
        ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
       } 
       return Json(new 
       { 
        result = "failed", 
        html = this.RenderToString("PartialEdit", dinner) 
       }); 
      } 
     } 

का उपयोग करते हुए यहाँ परिणाम पैरामीटर आप क्या कार्रवाई प्रत्येक मामले में क्या करने के लिए पता चल जाएगा, बस कॉलबैक पर यह जांच करने के लिए किया है।

+0

धन्यवाद। हालांकि, चुनौती का एक हिस्सा यह है कि मैं वास्तव में परिणामों को पार्टियल व्यू परिणाम के रूप में वापस भेजना चाहता हूं, न कि JSON परिणाम के रूप में। 2. के लिए, क्या आप 2 कॉल कर रहे हैं? परिणाम देने के लिए सफलता/त्रुटि और दूसरे को वापस करने के लिए? यह एक विकल्प है जिसे मैं सोच रहा था। – John

+0

इस संरचना के साथ वास्तव में एक कॉल {"स्थिति": [{"कोड": "त्रुटि"}], "एचटीएमएल": [{"एचटीएमएल": "बहुत सी एचटीएमएल"}]}। यदि आप चाहते हैं कि यह केवल आंशिक दृश्य परिणाम ऑब्जेक्ट हो, तो मॉडल में त्रुटियों के मामले में, छेद वापस क्यों नहीं आंशिक दृश्य संपादित करें? और जब कोई त्रुटि नहीं होती है तो विवरण आंशिक दृश्य, मॉडल राज्य इस तरह से कोई समस्या नहीं करेगा। – JOBG

+0

वह हिस्सा जो मेरे परिदृश्य को अधिकांश उदाहरणों से अलग करता है वह यह है कि मैं सफलता या त्रुटि के आधार पर दो बहुत अलग कार्य करना चाहता हूं। अगर यह एक त्रुटि है, तो मैं आंशिक दृश्य संपादित कर सकता हूं और संवाद को फिर से बना सकता हूं। हालांकि, अगर यह एक सफलता है, तो मैं संवाद बंद करना चाहता हूं और मुख्य पृष्ठ पर सूची को रीफ्रेश करना चाहता हूं। इसलिए क्लाइंट साइड कोड को यह जानने की जरूरत है कि यह कौन सा ऑब्जेक्ट अपडेट करना है - संवाद या सूची को जानने के लिए सफलता/विफलता है या नहीं। – John

2

एमवीसी 3 के साथ अपना पसंदीदा दृष्टिकोण जोड़ना। अपने संपादित विधि का उपयोग करके आप

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection formValues) 
{ 
    Dinner dinner = dinnerRepository.GetDinner(id); 
    try 
    { 
     UpdateModel(dinner); 
     dinnerRepository.Save(); 
     return Json (new { Success = true, Url = Url.Action("DetailsPartial", dinner), Div = "#DivToUpdateId" }); 
    } 
    catch 
    { 
     foreach (var issue in dinner.GetRuleViolations()) { 
     ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage); 
    } 
     //I am replacing this with a partial view which will contain the model state errors. For people using MVC 3 with razor they should be able to use their normal views as partials 
     return PartialView(dinner); 
    } 
} 

की तरह कुछ कर सकता है और फिर आप तो बुनियादी तौर पर, जैसे

success: function(data) { 
    if (data.Success) { 
     $.post(data.Url, function(partial) { 
      $(data.Div).html(partial); 
     }); 
    } 
    else 
    { 
     $('#formDiv').html(data) 
    } 
} 

एक सफलता समारोह का उपयोग कर सकते है, तो परिणाम Json तो data.Success सत्य है। इसके बाद यूआरएल में निर्दिष्ट क्रिया के परिणामों के साथ जेसन (डेटा.डिव) में निर्दिष्ट div को अद्यतन किया जाता है। यदि परिणाम जेसन नहीं है क्योंकि पोस्ट विधि विफल हो गई है और formDiv को आंशिक रूप से अद्यतन किया गया है जिसमें मॉडलस्टेट त्रुटियां हैं। यह दृष्टिकोण है जो मैं संवाद के लिए उपयोग करता हूं लेकिन यह बहुत अच्छी तरह से काम करता है। स्पष्ट रूप से एमवीसी 3 के साथ मैं TryUpdateModel इत्यादि का उपयोग करने जैसी कुछ संपादन विधि बदलूंगा, लेकिन बस मेरे दृष्टिकोण का उदाहरण देने की कोशिश कर रहा हूं। यूआरएल पास करके और विधि के परिणामों को पोस्ट करके आंशिक रूप से पास करने के लिए स्ट्रिंग में एचटीएमएल प्रस्तुत करने की आवश्यकता नहीं है।

+0

दिलचस्प। क्या आप PartialView संपादित करने के लिए अपना कोड पोस्ट कर पाएंगे? – John

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