2012-03-19 21 views
54

मेरे पास मेरे नियंत्रक में एक मूल संपादन विधि है जो संपादन सफल होने पर शीर्ष स्तर की सूची ("अनुक्रमणिका") पर वापस रीडायरेक्ट करता है। एमवीसी मचान के बाद मानक व्यवहार।सी # एएसपी.नेट एमवीसी पिछला पृष्ठ

मैं पिछले पृष्ठ पर वापस रीडायरेक्ट करने के लिए इस संपादन विधि को बदलने की कोशिश कर रहा हूं (इंडेक्स नहीं)। चूंकि मेरी संपादन विधि डिफ़ॉल्ट मैप किए गए इनपुट पैरामीटर "आईडी" का उपयोग नहीं कर रही थी, इसलिए मैंने पहले पिछले यूआरएल में पास करने के लिए इसका उपयोग करने की कोशिश की थी।

मेरी संपादित करें "प्राप्त" विधि में, मैं पिछले URL हड़पने के लिए इस लाइन का इस्तेमाल किया और यह ठीक काम किया:

ViewBag.ReturnUrl = Request.UrlReferrer; 

मैं तो मेरे फ़ॉर्म का उपयोग करके संपादित करें "पोस्ट" विधि को यह वापसी यूआरएल भेजा इस तरह टैग:

@using (Html.BeginForm(new { id = ViewBag.ReturnUrl })) 

अब यह पहिया गिर गई है। मैं आईडी पैरामीटर से यूआरएल को सही ढंग से पार्स नहीं कर सका।

*** अद्यतन: हल ** *

एक गाइड के रूप गैरी के उदाहरण का उपयोग करना, मैं "आईडी" के लिए "returnUrl" से मेरी पैरामीटर बदल गया है और एक छिपे हुए इस्तेमाल किया मेरे पैरामीटर को पास करने के लिए फ़ील्ड (फॉर्म टैग के बजाए)। सबक सीखा: केवल "आईडी" पैरामीटर का उपयोग करें जिसका उपयोग किया जाना था और इसे सरल रखना था। यह अब काम करता है। नोट्स के साथ मेरा अपडेटेड कोड यहां दिया गया है:

सबसे पहले, मैं Request.UrlReferrer का उपयोग कर पिछला यूआरएल पकड़ता हूं जैसा मैंने पहली बार किया था।

// 
    // GET: /Question/Edit/5 

    public ActionResult Edit(int id) 
    { 
     Question question = db.Questions.Find(id); 
     ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId); 
     ViewBag.Answers = db.Questions 
          .AsEnumerable() 
          .Select(d => new SelectListItem 
          { 
           Text = d.Text, 
           Value = d.QuestionId.ToString(), 
           Selected = question.QuestionId == d.QuestionId 
          }); 
     // Grab the previous URL and add it to the Model using ViewData or ViewBag 
     ViewBag.returnUrl = Request.UrlReferrer; 
     ViewBag.ExamId = db.Domains.Find(question.DomainId).ExamId; 
     ViewBag.IndexByQuestion = string.Format("IndexByQuestion/{0}", question.QuestionId); 
     return View(question); 
    } 

और अब मैं रूप में एक छिपी हुई फ़ील्ड का उपयोग कर [HttpPost] विधि के लिए मॉडल से returnUrl पैरामीटर पारित:

@using (Html.BeginForm()) 
{ 
    <input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" /> 
    ... 

[HttpPost] विधि में हम से पैरामीटर खींच छिपी हुई फ़ील्ड और इसे करने के लिए पुन: निर्देशित ....

// 
    // POST: /Question/Edit/5 

    [HttpPost] 
    public ActionResult Edit(Question question, string returnUrl) // Add parameter 
    { 
     int ExamId = db.Domains.Find(question.DomainId).ExamId; 
     if (ModelState.IsValid) 
     { 
      db.Entry(question).State = EntityState.Modified; 
      db.SaveChanges(); 
      //return RedirectToAction("Index"); 
      return Redirect(returnUrl); 
     } 
     ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId); 
     return View(question); 
    } 
+1

भले ही आप 'id' का उपयोग नहीं कर रहे हैं, मैं इसका उपयोग यूआरएल पास करने के लिए नहीं करूँगा। यह एक हैक की तरह लगता है, और मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है। –

+0

हां, ईरक आप सही हैं। मैं एक बदसूरत हैक का उपयोग कर रहा था। यह मेरा पहला एमवीसी ऐप है। मैंने कई चीजों की कोशिश की और कई पदों को पढ़ा और हैक मेरा सबसे अच्छा प्रयास था। मैंने इसे गैरी के उदाहरण के आधार पर तय किया। धन्यवाद, –

उत्तर

44

मैं यह सोचते हैं हूँ (कृपया मुझे सही कर अगर मैं गलत हूँ) है कि आप संपादित विफल रहता है संपादित करें पृष्ठ को फिर से प्रदर्शित करने के लिए और इस प्रयोग कर रहे हैं क्या करना चाहते हैं एक पुनर्निर्देशन।

उपयोगकर्ता को रीडायरेक्ट करने की कोशिश करने के बजाय आपको फिर से दृश्य वापस करके अधिक भाग्य हो सकता है, इस तरह आप किसी भी त्रुटि को आउटपुट करने के लिए मॉडलस्टेट का उपयोग करने में सक्षम होंगे।

संपादित करें:

प्रतिक्रिया के आधार पर अपडेट किया गया। आप पिछले URL को viewModel में रख सकते हैं, इसे एक छिपे हुए फ़ील्ड में जोड़ सकते हैं और फिर संपादन को सहेजने वाली क्रिया में इसे फिर से उपयोग कर सकते हैं।

उदाहरण के लिए:

@model ViewModel 

@using (Html.BeginForm()) 
{ 
    ... 
    <input type="hidden" name="PreviousUrl" value="@Model.PreviousUrl" /> 
} 

करने के लिए वापस जा रहे हैं:

public ActionResult Index() 
{ 
    return View(); 
} 

[HttpGet] // This isn't required 
public ActionResult Edit(int id) 
{ 
    // load object and return in view 
    ViewModel viewModel = Load(id); 

    // get the previous url and store it with view model 
    viewModel.PreviousUrl = System.Web.HttpContext.Current.Request.UrlReferrer; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Edit(ViewModel viewModel) 
{ 
    // Attempt to save the posted object if it works, return index if not return the Edit view again 

    bool success = Save(viewModel); 
    if (success) 
    { 
     return RedirectToAction(viewModel.PreviousUrl); 
    } 
    else 
    { 
     ModelState.AddModelError("There was an error"); 
     return View(viewModel); 
    } 
} 

आपके विचार या तो इस वापसी URL का उपयोग करने की जरूरत नहीं है के लिए BeginForm विधि, आप के साथ दूर होने में सक्षम होना चाहिए आपके फॉर्म एक्शन को गलत यूआरएल पर पोस्ट करना, ऐसा इसलिए है क्योंकि आप 'आईडी' पैरामीटर के रूप में यूआरएल पास कर रहे हैं, इसलिए रूटिंग स्वचालित रूप से रिटर्न पथ के साथ आपके यूआरएल को प्रारूपित करती है।

यह काम नहीं करेगा क्योंकि आपका फॉर्म एक नियंत्रक कार्रवाई पर पोस्ट करेगा जो संपादन को सहेजने के बारे में नहीं जानता है। आपको पहले अपनी सेव एक्शन में पोस्ट करना होगा, फिर इसके अंदर रीडायरेक्ट को संभालना होगा।

+2

+1। + अगर मैं कर सकता था। – Fenton

+0

हां, लेकिन संपादन को सफल होने पर मुझे पिछले पृष्ठ पर रीडायरेक्ट करने की आवश्यकता है। मुझे लगता है कि यह काम नहीं कर रहा था क्योंकि मैं "आईडी" का उपयोग कर रहा था। मैंने नीचे दिखाए गए पैरामीटर को "यूआरएल" में बदल दिया है और ऐसा लगता है कि यह मेरे पहले प्रयास पर काम करता है लेकिन मुझे इसे और अधिक परीक्षण करने की ज़रूरत है .... पकड़ो और मैं जो पोस्ट करता हूं उसे पोस्ट करूंगा। मैं इस साइट पर पोस्ट करने और इसे इस्तेमाल करने के लिए एक टिक लेने के लिए नया हूं। –

+0

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

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