2009-08-29 14 views
8

विफल रहता है मैं एक ऑब्जेक्ट को एक नियंत्रक क्रिया से दूसरे में पास करने का प्रयास कर रहा हूं। उद्देश्य यह है कि मैं चारों ओर गुजर रहा हूँ और अधिक या कम इस तरह दिखता है:जटिल गहरी वस्तु के साथ RedirectToAction (..)

public class Person 
{ 
    public string Name { get; set; } 
    public List<PhoneNumber> PhoneNumbers {get; set; } 
    public List<Address> Addresses { get; set; } 
} 

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

public class DialogController : Controller 
{ 
    public ActionResult Index() 
    { 
     // Complex object structure created 
     Person person = new Person(); 
     person.PhoneNumbers = new List(); 
     person.PhoneNumbers.Add("12341324"); 

     return RedirectToAction("Result", "Dialog", person); 

    } 

    public ActionResult Result(Person person) 
    { 
     string number = person.PhoneNumbers[0].ToString(); 
     return View(); 
    } 
} 

परिणाम विधि एक नल पॉइंटर एक्सेप्शन के साथ विफल हो के बाद से PHONENUMBERS सूची अचानक है RedirectToAction() विधि के साथ परिणाम कार्रवाई का आह्वान करने के बाद शून्य।

क्या किसी ने इस तरह के व्यवहार को पहले देखा है?

चीयर्स,

पीटर

उत्तर

5

मैं @ डेनिस से सहमत हूं - जब तक कि आप यूआरएल को बदलना नहीं चाहते हैं, तो आपको कुछ और सोचना होगा। इसका कारण यह है कि RedirectToAction डेटा को क्रमबद्ध नहीं करता है, यह रूट गुण मानों में गुणों को फिर से सक्रिय करता है जिसमें एक क्वेरी स्ट्रिंग का निर्माण होता है जिसमें कुंजियां संपत्ति नाम होती हैं और मान मूल्यों के स्ट्रिंग का प्रतिनिधित्व करती हैं। यदि आप यूआरएल परिवर्तन करना चाहते हैं, तो TempData का उपयोग करना शायद यह करने का सबसे आसान तरीका है, हालांकि आप आइटम को डेटाबेस में भी स्टोर कर सकते हैं, आईडी को परिणाम विधि में पास कर सकते हैं, और इसे वहां से पुन: स्थापित कर सकते हैं।

+0

हाय टी, मैं वस्तुओं को एक क्रिया से दूसरे में स्थानांतरित करने के लिए TempDaata चाल का उपयोग कर समाप्त हुआ। RedirectToAction कैसे काम करता है इसे साफ़ करने के लिए धन्यवाद। वह मेरे लिए असली भ्रमित हिस्सा था। –

7

तुम सच में अन्य कार्रवाई करने के लिए पुन: निर्देशित की जरूरत है? RedirectToAction एक नया नया http अनुरोध का कारण बनता है, यही कारण है कि TempData काम करता है। क्या आप इस तरह सीधे Result कार्रवाई को कॉल नहीं कर सके?

public ActionResult Index() 
{ 
    // Complex object structure created 
    Person person = new Person(); 
    person.PhoneNumbers = new List(); 
    person.PhoneNumbers.Add("12341324"); 

    return Result(person); 

} 

संपादित जब तक अपने अनुप्रयोग क्या आप प्रश्न में दिखाया है की तुलना में अधिक कर रहा है, यह नहीं दिखता है जैसे आप वास्तव में सूचकांक कार्रवाई की जरूरत है। आप उस कोड को स्थानांतरित कर सकते हैं जो एक नए व्यक्ति को निजी CreatePerson विधि में बनाता है। Result कार्रवाई में यदि person शून्य है, तो CreatePerson विधि पर कॉल करें। Index कार्रवाई पूरी तरह समाप्त हो सकती है, लेकिन इसके लिए आपके मार्गों को संशोधित करने की आवश्यकता होगी। या बस return RedirectToAction("Result", "Dialog"); को अपने Index कार्रवाई में कोड की एकमात्र पंक्ति बनें।

दरअसल, एमवीसी चिंताओं के अलगाव के बाद, CreatePerson विधि शायद आपके मॉडल कोड के अंदर एक विधि होनी चाहिए। नियंत्रक को एक नया Person बनाने का तर्क शामिल करने की आवश्यकता नहीं है। यह वास्तव में मॉडल में आता है।

+0

हाय डेनिस, जवाब के लिए धन्यवाद। आप व्यक्ति वस्तुओं के निर्माण के बारे में पूरी तरह से सही हैं। धन्यवाद! –

2

हालांकि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि एक डुप्लिकेट प्रश्न है, मुझे great answer to it मिला। कुंजी रूटवेल्यू डिक्शनरी कन्स्ट्रक्टर है।

return RedirectToAction("Result", "Dialog", new RouteValueDictionary(person)) 

जब से तुम संग्रह है, यह यह थोड़ा चालबाज, but this other answer covers this very nicely बनाता है।

0

हर किसी के लिए, वास्तव में कुछ क्रियाएं कॉल करने और जटिल ऑब्जेक्ट के साथ किसी अन्य नियंत्रक से दृश्य वापस करने की आवश्यकता होती है और TempData में ऑब्जेक्ट को पास करने के लिए (या नहीं) चाहती है।मैं बहुत बदसूरत लेकिन काम कर समाधान मेरे एप्लिकेशन में उपयोग करें:

protected ActionResult InternalRedirectToAction(string action, string controller, object model) 
{ 
    var htmlHelper = new HtmlHelper(new ViewContext(
           ControllerContext, 
           new WebFormView(ControllerContext, "HACK"), 
           new ViewDataDictionary(), 
           TempData, //for sharing TempData between Actions 
           new StringWriter()), 
         new ViewPage()); 

    var otherViewHtml = htmlHelper.Action(action, controller, model); 
    return Content(otherViewHtml.ToString()); 
} 

जवाब से प्रेरित होकर मिली: https://stackoverflow.com/a/4360019/1341409

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