2010-06-20 15 views
9

यह शायद एक नौसिखिया सवाल है।एएसपी.NET एमवीसी आंशिक विचार उनके मॉडल राज्य को रखते हुए?

जब मैं एक ASP.NET MVC2 आवेदन बनाने के लिए, एक कार्रवाई लॉगिन के साथ आपके खाते नियंत्रक इस तरह बनाई गई है:

[HttpPost] 
public ActionResult LogOn(LogOnModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     if (MembershipService.ValidateUser(model.UserName, model.Password)) 
     { 
     FormsService.SignIn(model.UserName, model.RememberMe); 
     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
     } 
     else 
     { 
      ModelState.AddModelError("", "The user name or password provided is incorrect."); 
     } 
    } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

अब, मैं एक प्रवेश पृष्ठ के लिए नहीं करना चाहते, मैं करना चाहते हैं एक बड़े पेज के हिस्से के रूप में लॉगिन नियंत्रण। इसलिए, मैंने login.aspx को login.ascx में बदल दिया और मैं इसे अपने मुख्य दृश्य में एचटीएमएल के साथ एकीकृत कर रहा हूं। रेंडरपार्टियल या एचटीएमएल। रेंडरएक्शन।

लॉगिन सफल होने पर दोनों आकर्षण की तरह काम करता है। यदि ऐसा नहीं है, तो

return View(model) 

मुझे मार रहा है। मैं जो चाहता हूं वह मेरे मुख्य पृष्ठ पर वापस जाना है (इसे होम/इंडेक्स कहते हैं) लेकिन आंशिक दृश्य की त्रुटि जानकारी के साथ।

return RedirectToAction("Index", "Home") 

स्पष्ट रूप से काम नहीं करता है।

संकेत?

उत्तर

3

यह निश्चित रूप से एक नौसिखिया प्रश्न नहीं है और मैंने इस समस्या के उत्तर के लिए वेब को ऊपर और नीचे दबा दिया है और अब तक का सबसे अच्छा समाधान इस ट्यूटोरियल here में छिपा हुआ था। यही वह है जो डारिन डिमिट्रोव अजाक्स रीफ्रेश के साथ सुझाव दे रहा था।मुझे लगता है कि लिंक के महत्वपूर्ण हिस्से को संक्षेप में प्रस्तुत करेंगे और क्यों यह आसानी से नहीं तय हो गई है:/

अजाक्स अजीब प्रेमी

पर आधारित ताज़ा निम्नलिखित समारोह पर ajax ताज़ा काफी टिका के साथ समाधान (अजीब प्रेमी ControllerContext का उपयोग करता है, लेकिन अभी मैं ControllerExtension है यह मेरे लिए मौजूद नहीं था):

ControllerExtension.RenderPartialViewToString(this,"mypartial", (object)model) 

इस समारोह क्या अपने मॉडल + modelstate लेता है और एक HTML स्ट्रिंग में अपने आंशिक दृश्य rerenders है। फिर आप उस स्ट्रिंग को ले जा सकते हैं और दृश्य को रीफ्रेश करने के लिए इसे किसी जावास्क्रिप्ट पर किसी जेसन ऑब्जेक्ट में वापस भेज सकते हैं। मैं jQuery का इस्तेमाल किया और यह इस तरह दिखता है,

$(document).ready(function() { 
    var partialViewUpdate = function (e) { 
      e.preventDefault(); //no postback 
      var partialDiv = $(this).parent(".partial"); 
      $.post($(this).attr("action"), 
        $(this).serialize(), 
        function (json) { 
        if (json.StatusCode != 0) { 
         // invalid model, return partial 
         partialDiv.replaceWith(json.Content); 
        } 
        else if (json.Content != null && json.Content != "") { 
         window.location.replace(data.Content); 
        }; 
      }); 

    $(".partial").find("form") 
       .unbind('submit') 
       .live("submit", partialViewUpdate); 
}; 

Jquery स्पष्टीकरण:

  1. div कि मेरे आंशिक (वर्ग = "आंशिक") शामिल हैं फिर से देखें और है कि भीतर div
  2. पत्र प्राप्त कर उस फॉर्म के साथ किसी भी अन्य "सबमिट" घटनाओं को अनबिंड करें (मुझे कुछ अजीब डबल सबमिट बग मिला जब तक कि मैंने यह अनबिंड नहीं किया)।
  3. उपयोग "लाइव" इतना है कि एक बार सामग्री बदल दिया जाता है इसे फिर से तो प्रस्तुत है कि यह सभी अजाक्स द्वारा नियंत्रित किया जा सकता परिष्करण से प्रपत्र rebinds
  4. एक बार जब हम समारोह partialViewUpdate दर्ज ...
  5. रोकें।
  6. div जिसमें लाने मेरी आंशिक रूप से यह लेने के द्वारा
  7. सेटअप jQuery पद यूआरएल (यह बाद में उपयोग किया जाएगा), $ (this) .attr ("कार्रवाई")
  8. रूप ले लो (यानी हमारा मॉडल) और कंट्रोलर फ़ंक्शन के लिए इसे क्रमबद्ध करें, $ (यह)। serialize()
  9. फ़ंक्शन बनाएं जो AJAX रिटर्न मान को संभालेगा।
  10. मैं अपनी व्यक्तिगत जेसन ऑब्जेक्ट का उपयोग करता हूं, जहां एक स्टेटस कोड 1 खराब है। तो यदि यह बुरा है तो मैं सामग्री में क्या लेता हूं, यह वह स्ट्रिंग है जो रेंडरपार्टियल व्यू टॉस्ट्रिंग ने मुझे दिया, और मैं सिर्फ उस भाग की सामग्री को प्रतिस्थापित करता हूं जिसमें मेरा आंशिक शामिल है।

ऐसा क्यों है "बस काम" नहीं है सामान्य रूप से

तो कारण आंशिक 'सिर्फ modelstate सत्यापन साथ काम नहीं करते है कि आप देखें (मॉडल) वापस नहीं लौट सकते पोस्ट के साथ क्योंकि एमवीसी आंशिक रूप से एम्बेडेड (index.aspx) के बजाय आंशिक दृश्य (login.ascx) के मार्ग पते पर हल करेगा।

आप RedirectAction() का भी उपयोग नहीं कर सकते हैं क्योंकि यह इसे (index.aspx) नियंत्रक फ़ंक्शन पर भेज देगा, जो सब कुछ साफ़ करने और index.aspx पृष्ठ को रीफ्रेश करने के बराबर है। हालांकि यदि आप चिनो और थबाज़ा द्वारा सुझाए गए एक्शनफिल्टर का उपयोग करते हैं तो जब आपका पृष्ठ रीफ्रेश हो जाता है और login.ascx नियंत्रक फ़ंक्शन को फिर से निकाल दिया जाता है तो वह उस tempdata को उठाएगा। हालांकि, पृष्ठ को रीफ्रेश करने पर क्लाइंट-साइड कोड जैसे पॉपअप मोडल्स के साथ परेशानी होती है (यानी यदि आप अपना पॉपअप रीफ्रेश कर चुके हैं) तो यह काम नहीं करता है।

यह नहीं कहो तो

अगर यह "सिर्फ काम" मैं पसंद करेंगे तो किसी को भी इस pleaaaase यह शेयर करने का सही/बेहतर तरीका जानता है!मुझे अभी भी लगता है कि अजाक्स रीफ्रेश और एक्शनफिल्टर समाधान इसे करने का एक साफ तरीका नहीं है क्योंकि यह लगभग आंशिक विचारों की तरह दिखता है, बिना किसी प्रकार के "चाल" के उपयोग करना असंभव है।

1

हाँ redirecttoaction लेकिन tempdata में इसके साथ एक त्रुटि संदेश प्रदान करते हैं ताकि आप इस

TempData["errorMsg"] = "incorrect values provided"; 
return RedirectToAction("Index", "Home") 

बेशक तरह कुछ मुख्य सूचकांक में आप एक div कि संदेश प्रदर्शित करता है होना चाहिए करना चाहिए

<%= html.Encode(TempData["errorMsg"]) %> 

EDIT मुझे लगता है कि आप मॉडलस्टेट को बनाए रखना चाहते हैं जो एक समस्या हो सकती है लेकिन आप जो कर सकते हैं वह इंडेक्स एक्शन में मॉडलस्टेट पास कर सकता है या टेम्पलेट में मॉडलस्टेट ऑब्जेक्ट पास कर सकता है। आप क्या कर सकते हैं तो जांच करें कि क्या ऑब्जेक्ट में मॉडलस्टेट त्रुटियां हैं और यदि फ़ील्ड की जांच हो और सही फ़ील्ड में त्रुटि जोड़ें।

+0

एचएम, शायद मैं TempData में संपूर्ण LogOnModel डाल सकता हूं। लेकिन मेरे लिए यह एक हैक लगता है। यहां साफ समाधान क्या होगा? – Sparhawk

+0

हां यह एक हैक है कि स्वच्छ समाधान इसके लिए एक फ़िल्टर लिखना है। इस प्रश्न को देखें और उदाहरण के लिए मेरा उत्तर http://stackoverflow.com/questions/2503032/where-to-use-controller-httpcontext/2503085#2503085 फ़िल्टर में आप जांचते हैं कि मॉडलस्टेट मान्य है या नहीं पाठ्यक्रम के मूल्यों को जोड़ें, इसे कस्टम विशेषता में रखना बेहतर होगा क्योंकि मुझे नहीं लगता कि आपको नियंत्रक के सभी कार्यों में इसकी आवश्यकता है। फिर आप उन कार्यों पर विशेषता का उपयोग कर सकते हैं जिसमें आप मॉडलस्टेट को बनाए रखना चाहते हैं। – Chino

+0

मेह। TempData के लिए यही है। मेरा अनुमान है कि आपको जादू तारों और दृढ़ता से टाइप किए गए डेटा की कमी पसंद नहीं है। यह उचित है, लेकिन इसकी शैली पसंद है, हैक नहीं। – a7drew

0

आप स्पष्ट रूप से वापस जाने के लिए दृश्य निर्दिष्ट कर सकते हैं:

return View("~/Views/Home/Index.aspx", model); 

इस तरह त्रुटि जानकारी संरक्षित किया जाएगा और सही दृश्य गाया।

+0

यदि मैंने ऐसा किया, तो मैं LogOnModel को होम/इंडेक्स-व्यू में पास कर दूंगा। वह शायद काम नहीं करेगा। शायद प्रश्न सभी के बाद इतनी नौसिखिया नहीं है :) – Sparhawk

+1

@Sparhawk, आप सही हैं। क्या होगा यदि आपने होम/इंडेक्स व्यू के मॉडल को वापस कर दिया? लॉगऑन व्यू मॉडल होम/इंडेक्स व्यू मॉडल का सबसेट होना चाहिए। एक विकल्प के रूप में आप लॉगऑन फॉर्म को अजाधित कर सकते हैं और इस क्रिया को असीमित रूप से आह्वान कर सकते हैं जो सफलता के मामले में क्लाइंट (window.location.href) पर रीडायरेक्ट किया जाएगा और त्रुटि के मामले में यह 'पार्टियल व्यू' और स्क्रिप्ट कॉलिंग लौटाएगा यह क्रिया 'div' को इस फ़ॉर्म से ताज़ा करेगी। –

+1

वर्तमान में यह होम/इंडेक्स व्यू मॉडल का सबसेट नहीं है। मेरे पास एक पोर्टल है और प्रत्येक पृष्ठ (जैसे होम/इंडेक्स) पर इसके कई नियंत्रण हैं। मैं पेज में रेंडरएक्शन के साथ नियंत्रण प्रस्तुत कर रहा हूं। तो, होम/इंडेक्स को लॉगऑनोडेल के बारे में कुछ भी क्यों देखना चाहिए? निश्चित रूप से, मैं AJAX का उपयोग कर सकता था। लेकिन यह इस मुद्दे को बाधित करने जैसा महसूस करेगा। सत्यापन तर्क के साथ आंशिक विचारों के लिए कोई साफ समाधान नहीं है? – Sparhawk

0

इस blog पर अभ्यास # 13 पर एक नज़र डालें। जब आप पीआरजी (पोस्ट-रीडायरेक्ट-गेट) शैली में कोडिंग कर रहे हों तो यह विधि मॉडलस्टेट जानकारी पास करने के लिए अच्छी तरह से काम करती है। आपको बस कुछ एक्शन फ़िल्टर बनाने की आवश्यकता होगी और उन्हें उचित रूप से प्राप्त करने और पोस्ट करने के लिए लागू करें।

0

मेरे पास एक ही समस्या थी जब Ajax.BeginForm का उपयोग किया गया, जहां मुझे आंशिक दृश्य वापस करने की आवश्यकता थी, लेकिन सभी मॉडलस्टेट त्रुटियां चली गईं। अजाक्स को अलग करना है। बेजिनफॉर्म भाग को एक अलग दृश्य में अलग करें, और इस दृश्य को UpdateTargetId div में किसी अन्य दृश्य में देखें।

इस तरह आप दृश्यमान मॉडल को मॉडल त्रुटियों के साथ वापस कर सकते हैं, या फिर बस अपनी पसंद का कुछ सफलता संदेश दिखाएं (यदि कोई हो)। यहां एक महान, विस्तृत स्पष्टीकरण है: http://xhalent.wordpress.com/2011/02/05/using-unobtrusive-ajax-forms-in-asp-net-mvc3/

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