2013-10-10 12 views
6

सीधे आगे सवाल, मेरे विचार को प्राप्त करने के लिए प्रतीत नहीं होता है यह देखने के लिए कि उपयोगकर्ता को फ़ॉर्म भरने के बाद निर्देशित किया गया है।व्यूबैग वैल्यू व्यू पर वापस क्यों नहीं जा रहा है?

करें .. advise..thanks

मेरे सूचकांक सरल रिटर्न मॉडल डेटा ActionResult

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View(model); 
} 

मेरे प्राप्त करें संपादित करें "ActionResult, बस एक ही मॉडल डेटा सूचकांक के रूप में उपयोग करता है।

मेरे पोस्ट "संपादित करें" ActionResult, मॉडल के लिए कोई नया मान निर्दिष्ट करता है और इंडेक्स पेज पर रीडायरेक्ट करता है, लेकिन इंडेक्स पेज व्यूबैग वैल्यू प्रदर्शित नहीं करता है ??

[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return RedirectToAction("Index");  
    } 
    return View(model); 
} 

और मेरे सूचकांक ध्यान में रखते हुए ...

@if(@ViewBag.Message != null) 
{ 
    <div> 
     <button type="button">@ViewBag.Message</button> 
    </div> 
} 

उत्तर

23

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

उपयोग TempData बजाय:

TempData["Message"] = "Profile Updated Successfully"; 
return RedirectToAction("Index"); 

और फिर अपने ध्यान में रखते हुए:

@if (TempData["Message"] != null) 
{ 
    <div> 
     <button type="button">@TempData["Message"]</button> 
    </div> 
} 

परदे के पीछे, TempData सत्र का उपयोग करेगा, लेकिन यह स्वचालित रूप से रिकॉर्ड को बेदखल एक बार आप इसे से पढ़ा जाएगा। तो इसका मूल रूप से शॉर्ट-लाइफ, एक-रीडायरेक्ट दृढ़ता भंडारण के लिए उपयोग किया जाता है।

वैकल्पिक रूप से आप इसे क्वेरी स्ट्रिंग पैरामीटर के रूप में पास कर सकते हैं यदि आप सत्रों पर भरोसा नहीं करना चाहते हैं (जो शायद मैं करता हूं)।

2

RedirectToAction HTTP 302 प्रतिक्रिया का कारण बनता है, जो क्लाइंट को सर्वर पर एक और कॉल करता है और एक नए पृष्ठ का अनुरोध करता है।

आपको पुनर्निर्देशन के बजाय एक दृश्य वापस करना चाहिए।

+0

ठीक है, वास्तव में, सफल पोस्ट के बाद रीडायरेक्ट करना सर्वोत्तम अभ्यास है - रीडायरेक्ट-पोस्ट-पोस्ट पैटर्न। केवल तभी देखें जब कुछ त्रुटियां हैं जिन्हें उपयोगकर्ता को ठीक करने और पुनः सबमिट करने की आवश्यकता है। –

+0

उपयोगकर्ता ने सीधे आगे सवाल के रूप में पूछा, मैंने सीधे जवाब दिया कि मूल्य क्यों प्रदर्शित नहीं किया जा रहा था। – Natan

+0

मुझे पता नहीं है कि सत्र में इसे संग्रहीत करने का नकारात्मक पक्ष यह है कि यदि आप स्केल करना चाहते हैं तो इससे परेशानी होती है। मैं सीधे दृश्य देखने के पक्ष में हूं, फिर इसे सत्रों में संग्रहीत करना (जिसे आपको हमेशा सावधान रहना चाहिए) – Kristof

2

RedirectToAction (msdn) आपके ब्राउज़र को नया अनुरोध करने के लिए निर्देश देता है।
तो आपके सर्वर को फिर से कॉल किया जाएगा, लेकिन यह रिक्त व्यूबैग और सभी
के साथ एक नया अनुरोध होगा, आप इंडेक्स विधि को कॉल करके एक प्रकार का आंतरिक रीडायरेक्ट कर सकते हैं, इस तरह व्यूबैग के पास अभी भी इसका डेटा होगा।

संपादित करें: आपको अपनी अनुक्रमणिका विधि या अपनी दृश्य (मॉडल) लाइन को भी संशोधित करना होगा, संपादन को प्रस्तुत करने का प्रयास करेगा।नीचे

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View("Index",model); 
} 


[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return Index();  
    } 
    return View(model); 
} 
+0

लीजेंड, जो सही काम करता है, धन्यवाद – mkell

+0

बस इस प्रश्न पर एक और मोड़ जोड़ने के लिए ... क्या होगा यदि मैं जिस दृश्य को लौट रहा हूं वह एक टैबड व्यू है और रीडायरेक्ट करने का मेरा एकमात्र तरीका है .. रीडरेक्टपेरेंटेंट ("~ /RefTarget/Index/#users");.......#users तीन टैबों में से एक है ... फिर मेरा दृश्य कैग संदेश ऑपरेशन कैसे करेगा? – mkell

+0

आप फिर से एक रीडायरेक्ट कर रहे हैं। मैं चयनित टैब को व्यूमोडेल पर या व्यूबैग में सेट करता हूं और इसे प्रस्तुत करते समय सही टैब का चयन करने के लिए दृश्य में यह मान जांचता हूं। – Kristof

0


पूर्ण कोड तुम भी

नियंत्रक

public ActionResult Test() 
    { 
ViewBag.controllerValue= "testvalue"; 
.................. 
    } 

देखें इस तरह से कोशिश कर सकते हैं - उस्तरा पेज के शीर्ष परिभाषित @{string testvalue= (string)ViewBag.controllerValue;}

$(function() { 
     var val= '@testvalue'; 
}); 
संबंधित मुद्दे