2013-04-11 7 views
6

ben döndüğünüzde gösterilecek bir hata mesajı gönderebilir nasılRedirectToAction

public ActionResult Impersonate(string id) 
{ 
    string result = ORCA.utilities.users.setImpersonation(id); 
    if(result == "nocommonfields") 
     return RedirectToAction("AdminUsers", "Admin"); 
    else 
     return RedirectToAction("terms_of_use", "Forms"); 
} 

var, bir ızgara üzerinde bir bağlantı var Yönetici Kullanıcıları sayfası

cevap

23

Sen TempData

if(result == "nocommonfields") 
{ 
    TempData["ErrorMessage"]="This is the message"; 
    return RedirectToAction("AdminUsers", "Admin"); 
} 

ve AdminUsers eylem kullanabilir, sen TempData çok kısa ömürlü olmaktadır, bu

public ActionResult AdminUsers() 
{ 
    var errMsg=TempData["ErrorMessage"] as string; 
//check errMsg value do whatever you want now as needed 
} 

hatırla okuyabilir. Oturum, geçici verilerin arkasındaki yedek depolamadır. Alternatif olarak, sorgulama listenizde bir bayrak göndermeyi ve bunu bir sonraki eylem yönteminizde okumayı ve gösterilecek hata iletisine karar vermeyi de düşünebilirsiniz. Üste | Bu tür bir işlevsellik elde etmek için TempData denetleyici özelliği

+0

o varsayılan dönmek mümkündür:

senin görünümünde
if(result == "nocommonfields") { FlashMessage.Warning("Your error message"); return RedirectToAction("AdminUsers", "Admin"); } 

sen şu deyimi daha önce herhangi hale sıralı mesajları şunlardır: aşağıdaki gibi RedirectToAction() aramadan önce basit bir mesaj kuyruk tempdata ile doğrulama hataları ve ValidationMessageFor öğesinde hatalar gösteriliyor? –

2

denetleyici özelliği kullanılabilir. Benim düşünceme göre temel dezavantajı, içeriğini depolamak için oturum deposunu kullanmasıdır. Bu, bir web çiftliğinde çalışmasını sağlamak için fazladan işlere sahip olacağınız veya oturumları ilk başta açmanız gerektiği anlamına gelir.

TempData ile ilgili iyi olan şey, tam olarak istediğiniz şeyi yapmaktır. Onun bir dize tabanlı sözlük ve içine herhangi bir şey koyabilirsiniz ve varsayılan olarak sadece bir kez olsun. Dolayısıyla, RedirectToAction() numaralı telefonu aramadan önce mesajınızı ayarlayın. Bir sonraki istekte mesajları kontrol edip görüntüleyebilirsiniz. Mesajları geri alarak isteklerin sonunda otomatik olarak silinir.

Alternatif olarak, iki istek arasında iletiyi taşımak için çerezleri kullanabilirsiniz. Temelde kendi çözümünüzü yuvarlayabilir veya TempData'un içeriğini çerezler aracılığıyla taşıyan bir özel ITempDataProvider uygulayabilirsiniz. Çerezleri doğru şekilde sağlamlaştırmanız gerektiğini unutmayın. Kendi yuvarlanmanız durumunda MachineKey.Protect() size yardımcı olabilir.

Yaptığınız aynı sorunla karşılaşıyordum ve bunun için FlashMessage adı verilen bir çözüm oluşturdum. Belki bu size biraz iş kazandırabilir. NuGet da mevcuttur. Kullanımı basit:

@Html.RenderFlashMessages() 
+0

İyi bir çözüm, başka bir olasılık, onu (örneğin, eğer hassas bir veri değilse) querystring ile gönderiyor .. Eğer hassas bir veri olsa da, ben yine de onu cookies'lerde saklamaktan emin değilim (hatta machineKey ile şifrelenmiş ..) Ve bu tarz bir düşünce beni kullanmaktan nefret etmese de TempData'yı kullanmamı sağlıyor :) Ama uzantı isminiz FlashMESSAGE ve sanırım kredi kartı numarasını çerezlerde saklamak değil – sotn