2013-04-11 15 views
6

mam link na siatce w moje AdminUsers zobaczyćRedirecttoAction z komunikatem o błędzie

grid.Column(header: "", format: (item) => (condition ? Html.ActionLink("Impersonate", "Impersonate", "Admin", new { id = item.username }, null) : Html.Label("Impersonate"), style: "webgrid-column-link"), 

W regulatorze mam

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"); 
} 

W jaki sposób można wysłać komunikat o błędzie, aby wyświetlić kiedy wrócę do na stronie AdminUsers?

Odpowiedz

23

Można użyć TempData

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

iw swoim działaniu AdminUsers, można przeczytać, że

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

Pamiętaj, TempData ma bardzo krótki przedział życia. Sesja to pamięć kopii zapasowej za danymi tymczasowymi.

Można również rozważyć wysłanie flagi do swojego zapytania i odczytanie jej w następnej metodzie działania, aby zdecydować, jaki komunikat o błędzie ma zostać wyświetlony.

+0

jest to możliwe do domyślnego powrót błędy sprawdzania poprawności z tempdata i pokazywanie błędów w ValidationMessageFor element? –

2

Właściwość kontrolera TempData może zostać wykorzystana do uzyskania tego rodzaju funkcji. Jego główną wadą jest, moim zdaniem, to, że używa pamięci sesji do przechowywania jej zawartości. Oznacza to, że będziesz mieć dodatkową pracę, aby mógł on funkcjonować na farmie internetowej, lub że musisz najpierw włączyć sesje.

Dobrą rzeczą w przypadku TempData jest to, że dokładnie to, co chcesz. Jest to słownik oparty na łańcuchach i możesz umieścić w nim wszystko i domyślnie wydostać go tylko raz. Zanim zadzwonisz pod numer RedirectToAction(), ustaw wiadomość. Przy następnej próbie sprawdzasz wiadomości i wyświetlasz je. Po pobraniu wiadomości są automatycznie usuwane na końcu żądania.

Alternatywnie można użyć plików cookie do transportu wiadomości między dwoma żądaniami. Zasadniczo można albo przetasować własne rozwiązanie, albo zaimplementować niestandardową wersję ITempDataProvider, która przenosi zawartość plików cookie za pomocą zawartości. Pamiętaj, że musisz odpowiednio zabezpieczyć pliki cookie. MachineKey.Protect() może Ci pomóc, jeśli będziesz trenował własny.

Miałem do czynienia z tym samym problemem co ty i stworzyłem rozwiązanie dla niego o nazwie FlashMessage. Być może to może zaoszczędzić ci trochę pracy. Jest również dostępny pod numerem NuGet. Sposób użycia jest prosty: wystarczy kolejce wiadomość przed wywołaniem RedirectToAction() następująco:

if(result == "nocommonfields") 
{ 
    FlashMessage.Warning("Your error message"); 
    return RedirectToAction("AdminUsers", "Admin"); 
} 

W widoku dołączyć następujące oświadczenie świadczą wcześniej w kolejce wiadomości:

@Html.RenderFlashMessages() 
+0

Dobre rozwiązanie, kolejną możliwością jest wysyłanie z querystringiem (oczywiście, jeśli nie są to wrażliwe dane). Chociaż jeśli są to wrażliwe dane, znowu nie jestem pewien przechowywania ich w ciasteczkach (nawet zaszyfrowane przy pomocy klucza MachineKey). I ten rodzaj myślenia prowadzi mnie do korzystania z TempData, chociaż nie cierpię z niego korzystać :) Ale twoja nazwa rozszerzenia to FlashMESSAGE i myślę, że nie jest przeznaczona do przechowywania numeru karty kredytowej w ciasteczkach lol – sotn

Powiązane problemy