2009-03-23 13 views
57

के साथ डेटा पास करना मैं एक एमवीसी उपयोगकर्ता फॉर्म में दर्ज डेटा लेना चाहता हूं और इसे एक अलग दृश्य में प्रदर्शित करना चाहता हूं।एमवीसी - रीडायरेक्ट टॉक्शन()

वर्ग निम्नलिखित निजी चर है:

IList<string> _pagecontent = new List<string>(); 

निम्नलिखित कार्रवाई एक FormCollection वस्तु स्वीकार करता है, यह सत्यापित करता है, और "पूर्वावलोकन" एक सूची के रूप में देखने के लिए उस पर से गुजरता है:

[Authorize(Roles = "Admins")] 
[ValidateInput(false)] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult UpdateContent(FormCollection collection) 
{ 
    if (ModelState.IsValid) 
    { 
     string PageToInsert = collection["PageToInsert"]; 
     string PageHeader = collection["PageHeader"]; 
     string PageBody = collection["PageBody"]; 

     //validate, excluded... 

     _pagecontent.Add(PageToInsert); 
     _pagecontent.Add(PageHeader); 
     _pagecontent.Add(PageBody); 

    } 
    return RedirectToAction("Preview", _pagecontent); 
} 

पूर्वावलोकन दृश्य में दृढ़ता से टाइप की गई वस्तु को पारित करने के लिए निम्न पृष्ठ निर्देश है सूची:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Template.Master" Inherits="System.Web.Mvc.ViewPage<List<string>>" %> 

मैं अपने डेटा प्राप्त करने के लिए मॉडल ऑब्जेक्ट का उपयोग करने में सक्षम होने की उम्मीद करता हूं, लेकिन मैं नहीं कर सकता।

<% if (Model[0].ToString() == "0") { %> 

और कुछ अजीब पैरामीटर URL में जोड़ दिया गया है, के रूप में यह करने के लिए हल करता है: निम्न पंक्ति में, मैं एक error index out of bounds अपवाद, सूचकांक बताते हुए गैर नकारात्मक और संग्रह के आकार से कम होना चाहिए मिल

  1. जब मैं RedirectToAction फोन और यह मेरी सूची गुजरती हैं, कारण है कि यह दृश्य के मॉडल वस्तु में पहुंचा नहीं जा सकता: http://localhost:1894/Admin/Preview?Capacity=4&Count=3

    तो मैं दो प्रश्न हैं?

  2. मैं जो करने की कोशिश कर रहा हूं, उसके बारे में जाने का उचित तरीका क्या है, अर्थात् वहाँ प्रदर्शन के लिए स्ट्रिंग का संग्रह पास करें?

उत्तर

55

TempData का उपयोग करने का प्रयास करें। यह एक एकल शॉट सत्र वस्तु की तरह है। आप TempData में इच्छित मान डालते हैं, तुरंत रीडायरेक्ट करते हैं और उन्हें बाहर निकाल देते हैं। http://blogs.teamb.com/craigstuntz/2009/01/23/37947/

+0

मैंने व्यूडेटा को आजमाया लेकिन इसे काम नहीं कर सका। TempData के साथ ही, लेकिन मैंने कल रात बिस्तर से पहले इसे एक संक्षिप्त जाना दिया। सबसे बड़ी बात यह है कि, मैं वास्तव में इन शब्दकोशों से बचना चाहता हूं और दृढ़ता से टाइप किए गए व्यू मॉडल ऑब्जेक्ट – splatto

+1

हाँ का उपयोग करना चाहता हूं, लेकिन आपका व्यू मॉडल ऑब्जेक्ट - जो कि HTTP 302 पर दृढ़ता से टाइप नहीं किया जा रहा है। आप मॉडल को टेम्पपडाटा में चिपका सकते हैं और इसे बाहर निकाल दिया। (ईमानदारी से, मुझे एएसपी.नेट एमवीसी का उपयोग करते समय टाइपिंग पर आधा छोड़ना आसान लगता है, क्योंकि यह बस इसे अच्छी तरह से नहीं करता है।) – MichaelGG

4

RedirectToAction के साथ समस्या यह एक HTTP 302 लौट रही है और ब्राउज़र इसके बाद जा रहा है और एक नया नया HTTP अनुरोध कर रहा है। आप अनुरोधों के बीच डेटा को जारी रखने के लिए कुकी और/या सत्र ऑब्जेक्ट का उपयोग करने पर विचार करना चाह सकते हैं।

-3

ऐसा लगता है कि आप देख रहे हैं की तरह UpdateModel आदेश के लिए: विषय पर ScottGu के ब्लॉग पोस्ट

चेक आउट:

Improved UpdateModel and TryUpdateModel methods

2

यह आप की तरह लगता है 'यहाँ एक अच्छा writeup है कि एक पुनर्निर्देशन भौंक के लिए एक "साफ स्लेट" माना जाता है

public ActionResult UpdateContent(FormCollection form) { 
    ... 
    return View("Preview", _pagecontent); 
} 

नोट: करने के लिए प्रयास कर रहे हैं er (ऑथ कुकी जैसी चीज़ों को छोड़कर)। आपको अगले अनुरोध के साथ जानकारी पास करने के लिए ब्राउज़र को बताने के लिए नहीं मिलता है, क्योंकि अगला अनुरोध स्वयं ही खड़े होने में सक्षम होना चाहिए। आपको बस इतना करना है कि ब्राउजर को बताएं कि कौन सी यूआरएल अगले अनुरोध करेगी। एएसपी.नेट एमवीसी में, जब आप RedirectToAction पर तर्क-ऑब्जेक्ट पास करते हैं, तो उस ऑब्जेक्ट के सार्वजनिक गुण जेनरेट किए गए URL पर क्वेरी-स्ट्रिंग पैरामीटर के रूप में जोड़े जाते हैं।

+0

रिटर्न व्यू() का उपयोग न करने का मेरा कारण यह है कि यूआरएल कॉलिंग व्यू प्रदर्शित करेगा (AddContent), प्रस्तुत दृश्य (पूर्वावलोकन) नहीं। जब उपयोगकर्ता "सबमिट" बटन पर क्लिक करता है, तो वह उसी एडकंटेंट [पोस्ट] एक्शन को कॉल करता है जो पूर्वावलोकन पूर्वावलोकन प्रदान करता है, इसलिए मैं पूर्वावलोकन [पोस्ट] एक्शन नहीं दबा सकता। – splatto

+0

आप/MyController/AddContent पर क्यों पोस्ट कर रहे हैं? क्यों/MyController/पूर्वावलोकन पर पोस्ट नहीं? – yfeldblum

+0

मैं पूर्वावलोकन में अपनी एडकंटेंट एक्शन पोस्ट रखने की कोशिश कर रहा हूं, लेकिन जब मैं व्यू ("पूर्वावलोकन", _pagecontent) वापस लौटाता हूं तो यह पूर्वावलोकन प्रस्तुत करता है लेकिन यूआरएल "/ नियंत्रक/जोड़ें सामग्री" कहता है। फिर जब मैं डेटाबेस पर बने रहने के लिए बटन क्लिक करता हूं, तो यह फिर से पूर्वावलोकन पोस्ट एक्शन के बजाय एडकंटेंट पोस्ट एक्शन को कॉल करता है। – splatto

7

रीडायरेक्टएक्शन का दूसरा पैरामीटर मार्ग वैल्यूज है, मॉडल नहीं।

protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues); 

मॉडल के लिए टेम्पडडेटा का उपयोग करने का प्रयास करें। रीडायरेक्ट के बीच लगातार डेटा के लिए।

3

यह काम नहीं कर रहा है क्योंकि RedirectToAction वास्तव में ब्राउज़र में एक Http 302 वापस भेज रहा है। जब ब्राउज़र को यह 302 प्राप्त होता है, तो यह सर्वर को नए पृष्ठ के लिए एक नया अनुरोध करता है। नया अनुरोध, नया अस्थायी चर।

जब आप कुछ सहेजने/संपादित/हटाने की कोशिश करते हैं तो आपको इस समस्या का भी सामना करना पड़ेगा और किसी कारण से आप इसे अस्वीकार कर देते हैं और आपको पुराने फॉर्म को फिर से वापस करना होगा।

तो, बजाय:

return RedirectToAction("Preview", _pagecontent); 

एक अलग विधि में पूर्वावलोकन तर्क रखो और बस इसे कहते हैं:

return PreviewLogic(_pagecontent); 

तुम भी उपयोग कर सकते हैं TempData [] के लिए डेटा लागू करने के लिए डीआईसी अगले अनुरोध जैसे अन्य ने कहा है, लेकिन फिर आप सर्वर के लिए 302 अतिरिक्त राउंड ट्रिप से नहीं बचेंगे।

10

TempData का उपयोग करते समय सावधान रहें। यह एक सर्वर वातावरण में बहुत अच्छा काम करता है लेकिन क्लाउड वातावरण में यह उम्मीद के अनुसार काम नहीं कर सकता है क्योंकि आप गारंटी नहीं दे सकते कि अनुरोध एक ही मशीन पर होगा। ऐसा इसलिए होता है क्योंकि TempData एएसपीनेट सत्र पर भरोसा करता है। लेकिन यदि आप SQL या AppFabric कैश जैसे अन्य सत्र प्रबंधक का उपयोग कर रहे हैं तो यह ठीक काम करेगा।

0

क्या आप सिर्फ उसी नाम के साथ 2 क्रिया परिणाम नहीं बना सकते हैं और उनमें से 1 को HttpPost से चिह्नित कर सकते हैं?

public ActionResult UpdateContent(FormCollection preview = null) 
    { 
     return View(preview); 
    } 
    [HttpPost] 
    public ActionResult UpdateContent(FormCollection collection = null, bool preview = false) 
    { 
     if (preview) 
      return UpdateContent(collection); 
     else 
      return UpdateContent(null); 
    } 
संबंधित मुद्दे