Hej, mam taką sytuację i zastanawiam się, czy dobrze jest to robione.
Wszystko jest pisane w .NetCore.
Jest sobie WebAPI, do którego podłączają się różni klienci - WebApplication, Wpf, mobilne itd.
I teraz tak. Jest WebApplication, które w pewnym momencie musi coś wykonać, np:
(to fragment kontrolera)
public async Task<IActionResult> DeleteDocument(Guid id)
{
Document doc = new Document();
doc.Id = id;
bool result = await docContr.DeleteDocument(doc);
if (!result)
this.ShowDialogIfExists(dialogs);
return await ShowDocumentLisrForLoggedUser();
}
Tutaj operacja faktycznego usunięcia dokumentu jest oddelegowana do WebApi. Obiekt docContr robi tyle, że wywołuje metodę z API, a potem sprawdza odpowiedź. I w klientach desktopowych/mobilnych działa to tak, że jeśli jest błąd, to pokazywany jest komunikat błędu.
Oczywiście w WebApplication musi to być inaczej zrobione (stąd obiekt docContr przyjmuje interfejs IDialogs, który ma różne implementacje).
Rozszerzenie ShowDialogIfExists robi tylko tyle, że sprawdza, czy jest jakiś komunikat do pokazania, a potem po prostu dodaje odpowiednie ViewData. np:
DialogInfo di = new DialogInfo(DialogTypes.Alert, "Hej, masz błąd", "Nie możesz tego zrobić, bo blablabla");
ViewData["DialogInfo"] = di;
Następnie główny widok sprawdza, czy ma coś takiego jak np. ViewData["DialogInfo"] i jeśli tak, to pokazuje komunikat błędu.
I to wszystko działa poprawnie... Ale...
Załóżmy, że użytkownik wchodzi na listę dokumentów. W przeglądarce jest adres: https://localhost/Documents
Następnie użytkownik chce usunąć jakiś dokument - wywołuje się powyższa akcja z kontrolera, która jest pod adresem: https://localhost/Documents/DeleteDocument/5 (to idzie POSTem)
Po operacji usunięcia dokumentu (niezależnie od tego, czy się udało, czy nie), znowu muszę pokazać listę dokumentów, więc na początku próbowałem tak:
RedirectToAction("Index");
Problem pojawił się w momencie, gdy był błąd. Bo oczywiście po takim redirekcie ViewData było czyszczone. Więc zrobiłem to z użyciem metody pomocniczej: ShowDocumentLisrForLoggedUser, która po prostu pobiera listę dokumentów i zwraca widok: return View("Index")
I to działa super.
Problem jest tylko taki, że w przeglądarce pozostaje adres: https://localhost/Documents/DeleteDocument/5
, a ja bym chciał, żeby użytkownik zobaczył: https://localhost/Documents
Jak to osiągnąć? I czy w ogóle to, co robię, robię dobrze? Czy może .NetCore ma jakiś predefiniowany mechanizm do pokazywania błędów z kontrolerów?