2011-03-23 15 views
10

हाय,ASP.NET MVC में रीडायरेक्ट के साथ जटिल ऑब्जेक्ट पास करें?

मैं एक कार्रवाई है कि इस तरह दिखता है:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files) 

AdRegister एक जटिल वर्ग है और मैं रजिस्टर कार्रवाई में और नीचे एक रीडायरेक्ट विधि करने के लिए इस पारित करने के लिए की जरूरत है, इस तरह:

return this.RedirectToAction("Validate", adRegister); 

मान्य कार्रवाई इस तरह दिखता है:

public ActionResult Validate(AdRegister adRegister) 

मुझे पता है कि मैं सरल पैरामीटर पास कर सकता हूं लेकिन इस मामले में यह एक जटिल वस्तु है। यह उदाहरण काम नहीं करता है, विज्ञापनदाता की संपत्ति शून्य होगी।

क्या यह सकारात्मक और यदि ऐसा है, तो कैसे?

BestRegards

अधिक जानकारी: रजिस्टर कार्रवाई adRegister ले और उस पर som जादू क्या करेंगे, तो यह मान्य कार्रवाई करने के लिए भेजा जाएगा। मान्य कार्रवाई उपयोगकर्ता को एक सत्यापन पृष्ठ वापस कर देगा। जब उपयोगकर्ता अनुदान बटन दबाता है तो adRgister फॉर्म से भर जाएगा और फिर vValidate पोस्ट पर भेजा जाएगा जहां इसे सहेजा जाएगा। मैंने adRegister को कैश या डेटाबेस में अस्थायी रूप से रखने के लिए देखा है, लेकिन अगर मैं इसे अगली कार्रवाई में सरल कर सकता हूं तो यह बेहतर होगा।

उत्तर

17

एक संभावना यह क्वेरी स्ट्रिंग में सरल गुण पारित करने के लिए होगा:

return RedirectToAction(
    "Validate", 
    new { 
     foo = adRegister.Foo, 
     bar = adRegister.Bar, 
     ... and so on for all the properties you want to send 
    } 
); 

एक और संभावना यह या सत्र (पुन: निर्देशन के जीवन भर के लिए) (एएसपी के जीवन भर के लिए TempData में स्टोर करने के लिए है नेट सत्र):

TempData["adRegister"] = adRegister; 
return RedirectToAction("Validate"); 

और फिर TempData से प्राप्त:

public ActionResult Validate() 
{ 
    adRegister = TempData["adRegister"] as AdRegister; 
    ... 
} 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files) 
{ 
    ... 
    string id = Repository.Save(adRegister); 
    return RedirectToAction("Validate", new { id = adRegister.Id }); 
} 

और फिर डेटा की दुकान से यह लाने के बाद आप अनुप्रेषित:फिर भी एक और संभावना (और एक मैं तुम्हें सिफारिश करेंगे) अपने डेटासंग्रह में POST पद्धति में इस वस्तु जारी रहती है

public ActionResult Validate(string id) 
{ 
    AdRegister adRegister = Repository.Get(id); 
    ... 
} 
+0

ठीक है, तो कार्रवाई के लिए जटिल वस्तु को गंभीर रूप से भेजने के लिए संभव नहीं है।TempData के साथ समस्या हो सकती है यदि उपयोगकर्ता पृष्ठ को रीफ्रेश करें। मैबी डेटाबेस में इसे स्टोर करने का सबसे अच्छा तरीका है और उसके बाद सेट अंतराल के साथ साफ़ हो जाता है (उपयोगकर्ता चरण 2 तक पहुंच सकता है और फिर निरस्त कर सकता है, यदि ऐसा है, तो डेटा अभी भी डेटाबेस में होगा)। – Banshee

+0

यदि वे सत्रों में निरस्त हो रहे हैं, तो मुझे लगता है कि डेटाबेस बेहतर है .. –

+0

@SnowJim, हाँ आप पृष्ठ को रीफ्रेश करने वाले उपयोगकर्ता के बारे में सही हैं। यही कारण है कि मैं इसका उपयोग करने की सिफारिश नहीं करता। सबसे अच्छा तरीका यह डेटाबेस या सत्र में स्टोर करना है। –

1

एक विचार शायद एक सत्र चर बना देगा और एक कुंजी के चारों ओर पास करेगा जो उस सत्र चर के संदर्भ में है यदि ऑब्जेक्ट को कुछ विचारों की आवश्यकता है?

+0

हां जो काम कर सकता है, केवल समस्या यह है कि यदि उपयोगकर्ता को पृष्ठ सबमिट करने में लंबा समय लगता है, तो सत्र पहले ही हटा दिया जा सकता है। फिर डेटाबेस में इसे स्टोर करना बेहतर होगा। लेकिन फिर सत्र सत्र को फिर से 60 मिनट तक सेट किया जा सकता है, जो पर्याप्त होना चाहिए। – Banshee

+0

यदि यह वर्कफ़्लो कुछ विशिष्ट है, तो इसमें अधिक समय लगेगा और सत्र को लाइव रखने की आवश्यकता होगी, सत्र आवंटित एजेक्स कॉल के माध्यम से सत्र को ध्यान में रखते हुए सत्र टाइमआउट सेट करने से बेहतर होगा ... –

1

एएसपी.नेट एमवीसी का tempdata इसके लिए सही होना चाहिए।

उस ने कहा, टेम्पपडाटा या सत्र एक विकल्प है, लेकिन कुछ डाउनसाइड्स बहुत उल्लंघन और कई बार गड़बड़ाना या डिबग करना मुश्किल है। एक बेहतर स्टोर में अस्थायी मूल्य को "छेड़छाड़" करना संभव है, जैसे कि उपयोगकर्ता की प्रोफ़ाइल या अपना स्वयं का डेटाबेस, फिर वैध विधि के माध्यम से एक कुंजी पास करें जो तब स्टोर से डेटा लोड कर सकता है। यह त्याग किए गए गाड़ियां और इस तरह की वसूली की संभावना भी खुलता है।

+0

aha मेरे पास कैश है मैं टाइमर सेट कर सकते हैं। मैं ऑब्जेक्ट को इस कैश में संग्रहीत कर सकता हूं और फिर हर बार टीआई उपयोगकर्ता टाइमआउट को 60 मिनट या उस तरह कुछ अपडेट करने के लिए सबमिट करता है। इसका मतलब है कि मुझे डेटाबेस को मैन्युअल रूप से साफ नहीं करना होगा और यदि उपयोगकर्ता रीफ्रेशिंग और ऐसे कुछ अजीब सामान बनाता है तो भी मैं डेटा पुनर्प्राप्त कर सकता हूं। – Banshee

+0

वहां सावधान रहें - अधिकांश मामलों में एएसपी.NET कैश सत्र भंडारण से अधिक उल्लंघन करता है। यह पहली बात है जब स्मृति कम हो जाती है जब हमला हो जाता है। मैं उपयोगकर्ता डेटा के लिए कैश पर सत्र का उपयोग करूंगा। –