2016-12-08 10 views
5

मैंने एएसपी.नेट एमवीसी 5 ढांचे का उपयोग कर एक आवेदन लिखा था। मैं विचारों और ViewModels के बीच बाध्यकारी दो तरीकों का उपयोग कर रहा हूँ।मैं मॉडलस्टेट डिक्शनरी से डेटा को मैन्युअल रूप से एएसपी.नेट एमवीसी के साथ प्रस्तुति मॉडल में कैसे बाध्य कर सकता हूं?

चूंकि मैं दो तरह के बाध्यकारी का उपयोग कर रहा हूं, मुझे क्लाइंट और सर्वर साइड सत्यापन का लाभ मिलता है जो ठंडा है। हालांकि, जब मैं सर्वर को POST अनुरोध भेजता हूं, और अनुरोध हैंडलर अपवाद फेंकता है, तो मैं उपयोगकर्ता को GET विधि पर रीडायरेक्ट करना चाहता हूं।

जब रीडायरेक्ट होता है, तो मैं मॉडल स्थिति को सहेजना चाहता हूं ताकि जब मैं त्रुटियों को प्रदर्शित करता हूं तो पेज समान दिखता है। मैं ActionFilters और TempDatavia this approach का उपयोग कर राज्य मॉडल और त्रुटियों को सहेजने में सक्षम हूं। हालांकि, जब अनुरोध को रीडायरेक्ट किया जाता है, POST से GET तक मॉडल स्थिति System.Web.Mvc.ModelStateDictionary ऑब्जेक्ट के रूप में सहेजी जाती है जो POST अनुरोध से आए सभी उपयोगकर्ता इनपुट के साथ एक कुंजी/मूल्य जोड़ी है।

अंतिम उपयोगकर्ता को सही ढंग से पृष्ठ प्रस्तुत करने के लिए, मुझे अपने प्रस्तुति मॉडल में System.Web.Mvc.ModelStateDictionary में डेटा को बाध्य करने की आवश्यकता है।

मैं अपनी प्रस्तुति ऑब्जेक्ट पर System.Web.Mvc.ModelStateDictionary ऑब्जेक्ट को कैसे बांध सकता हूं?

यहाँ उसमें कोई त्रुटि है तो कैसे मेरे कोड की तरह

[ImportModelStateFromTempData] 
public ActionResult show(int id) 
{ 

    var prsenter = new UserProfileDetailsPresenter(id); 

    ModelStateDictionary tmp = TempData["Support.ModelStateTempDataTransfer"]; 

    if(tmp != null) 
    { 
     // Some how map tmp to prsenter 
    } 

    return View(prsenter); 

} 

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 
    } finally 
    { 
     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
} 

उत्तर

4

लग रहा है, रीडायरेक्ट न करें, तो व्यू वापसी है।

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 

     // Return the named view directly, and pass in the model as it stands. 
     return View("Show", model); 
    } 
} 
+0

"शो" दृश्य 'UserProfileDetailsPresenter' ऑब्जेक्ट' विवरणदाता 'की अपेक्षा नहीं कर रहा है। प्रत्येक अनुरोध में 'UserProfileDetailsPresenter' बनाने के बजाय, मैं' इंडेक्स 'एक्शन पर रीडायरेक्ट करता हूं और इसे सही ऑब्जेक्ट बना देता हूं और केवल डेटा को बांधता हूं। – Jaylen

+0

आप सबसे अच्छी शर्त है कि आप दोनों जगहों पर उस कॉल को बनाते हैं (कुडोस पहले से ही इसे एक विधि में रखते हैं)। आप हर बार ध्यान दिए बिना उस 'UserProfileDetailsPresenter' को बनाने जा रहे हैं। एमवीसी में ऐसा करने का यह सही तरीका है। आप अपने डेटाबेस में गलत, विकृत, या यहां तक ​​कि संभावित खतरनाक डेटा भी नहीं डालना चाहते हैं। – krillgar

+0

तो उस स्थिति में ExportModelStateToTempData की कोई आवश्यकता नहीं है, है ना? इसे रखने का क्या फायदा होगा? – Jaylen

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

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