2010-07-29 16 views
26

Sorunuma özgü üç işlemi gerçekleştiren bir denetleyicim var.Eylemi yönlendir ve veri geçirmesi gerekiyor

Birincisi, kullanıcının belirtilen öğedeki özellikleri düzenleyebileceği bir HTML formuna sahip bir görünüm döndüren düzenleme eylemidir. İkincisi, tarayıcıdan geri gönderimi kabul eden ve veritabanını güncelleyen güncelleme eylemidir. Güncelleme başarılı olduğunda, eyleme geçmek için bir yönlendirme yaparız.

Üçüncü, verilen öğenin ayrıntılarını gösteren gösteri eylemidir. Bu işlem, başarılı bir güncellemeden sonra yönlendirildiğimiz yerdir.

akışıdır:

Show -> Edit -> Güncelleme (Sucess: y - Düzen> return -> Göster yönlendirme, n)

Ne elde etmek istediğiniz bir bayrak takıldı etmiş olduğu Güncelleme başarılı olduğunda, bir sonraki Göster görünümünde kullanıcı için bir onay mesajı görüntüleyebilirim. Sorun şu ki, bu verileri RedirectToAction() çağrısı üzerinden taşımanın en iyi yolundan% 100 emin değilim. Tek düşündüğüm bir sorgu dizesi kullanıyor muydu? Biz zaten başka bir amaç için sorgu dizgisi ile değişkenler taşıyoruz ama benim bir parçamı kötüye kullanmak şüpheci. Yönlendirme çağrısı aşağıda.

RouteValueDictionary dict = Foo.GetRouteValues(bar); 

RedirectToAction("Show", dict); 

Bu soruyu da okudum ama eğer yapmam gerekmiyorsa TempData özelliğini kullanma konusunda can sıkıcıyım. Bazı öneriler için

Question

teşekkürler!

cevap

39

DÜZENLEME: Üzgünüm, orijinal olarak TempData'yı kullanmak istemediğinizde notunuzu görmedik. Özetle - istemciye yönlendirildikleri sayfayı yenilediğinde/yeniden yüklediğinde iletinizin yeniden görünmesini ister misiniz? Eğer, o zaman sorgu dizesi kullanmak yoksa

, gibi bir şey: o zaman

return(RedirectToAction("Index", new { message = "hi there!" })); 

ve ya

public ActionResult Index(string message) { } 

tanımlamak veya açıkça Request.QueryString [ "mesaj"] çıkarıp onu geçmek ViewData yoluyla View her zamanki gibi. Bu, sitenizden çerez kabul etmeyen tarayıcılarda da çalışır.

İletinin yeniden görüntülenmesini istemiyorsanız, ASP.NET MVC 1.0, bu tam amaç için TempData koleksiyonunu sağlar.

TempData özellik değerleri onlar temizlenir sonra aynı tarayıcıdan, sonraki istek dek oturum durumunda saklanır - böylece hemen RedirectToAction dönmeden önce TempData bir şey koymak, eğer sonucu bulunmaya devam eder yönlendirme ancak hemen sonra temizlenecektir.

public ActionResult Index() { 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(string submitButton) { 
    TempData["message"] = "You clicked " + submitButton; 
return(RedirectToAction("Index")); 
} 

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

ve ilgili görünümü/Görüntüleme/Ev/Index:

İşte basit bir ASP.NET MVC başlangıç ​​projesinde HomeController için bir değişikliktir.

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <% if (TempData["message"] != null) { %> 
    <p><%= Html.Encode(TempData["message"]) %></p> 
    <% } %> 
    <% using (Html.BeginForm()) { %> 
    <input type="submit" name="submitButton" value="Button One" /> 
    <input type="submit" name="submitButton" value="Button Two" /> 
    <% } %> 
</asp:Content> 

Sen TempData mesajı derhal bir diziyi SONRASI YENİDEN YÖNLENDİRME-GET aşağıdaki görüntülenen olduğunu fark edeceksiniz, ancak sayfayı yenileyin, eğer tekrar gösterilmeyecektir: aspx böyle bir şey içermelidir. Bu davranış ASP.NET MVC 2'de değiştiğini

Not - Daha fazla bilgi için this article yılında "Eylem Yöntemleri arasındaki Devleti geçirilmesi" bölümüne bakın.

+0

Teşekkür şey daha karmaşık geçmesi başlarsak. Makaleye 2.0'dan beri baktığımıza bakacağım. Benim yazı içinde TempData özelliği uzak kalmak istedim, ancak bu defacto yol ise o zaman belki çok kötü olmayacak dedi. Tekrar teşekkürler. –

+4

Bu eski bir soru, ancak bağlantı şu anda bozuk :( –

+3

Modern (ish) Bu yazı için çalışma bağlantısı (yaklaşık olarak aşağıya doğru ilerleyin): http://msdn.microsoft.com/en-us/library/dd394711 (v = vs.100) – Jaxidian

4

ya TempData hayranı asla ve ayrıca ben

App/Ayarlar görmek istemiyordu gibi URL'ye başarı bayrağını geçmek istemiyordu? SaveSuccess = true

yılında tarayıcının URL çubuğu.

[HttpPost] 
public ActionResult Settings(SettingsViewModel view) 
{ 
    if (ModelState.IsValid) 
    { 
     //save 
     Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "")); 
     return RedirectToAction("Settings"); 
    } 
    else 
    { 
     return View(view); 
    }  
} 

ve bu Cookie varlığı için gelen alın eylem kontrol altında ve silin

:

[HttpGet] 
public ActionResult Settings() 
{ 
    var view = new SettingsViewModel(); 
    //fetch from db and do your mapping 
    bool saveSuccess = false; 
    if (Request.Cookies["SettingsSaveSuccess"] != null) 
    { 
     Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) }); 
     saveSuccess = true; 
    } 
    view.SaveSuccess = saveSuccess; 
    return View(view); 
} 

bu oldukça slipperly olabilir nb

Benim çözümüm geçici bir çerez kullanır yamaç Eğer güzel açıklama için bir boolean bayrağından daha

+0

Hi .aspx? - çerez değerine onay mesajı olacağını dize geçirirseniz tehlike nedir (örn ayarlarınız tamam kaydedilmiş veya ayarlar kaydedilmez) – Bartosz

+0

@Bartosz sen edebiliyoruz sadece bir boole kullanın ve buna göre yanıt mesajını ayarlayın? Yanıt mesajı 2'den fazla şey olabilirse o zaman bu konuda pragmatik olmanız gerekecek - biraz yanlış geliyor - yani birden fazla hata mesajınız varsa yönlendirmeden önce gösterilecek - Ayarlarınız kaydedilmediyse, bu kodun ilk snippet'indeki else ifadesiyle işlenmeli ve yönlendirilmemelidir. – wal

İlgili konular