RedirectToAction
zwraca odpowiedź 302 do przeglądarki klienta, a więc przeglądarka będzie zrobić nowy GET żądanie do adresu URL w miejscu wartości nagłówka odpowiedzi przyszedł do przeglądarka.
Jeśli próbujesz przekazać prosty model widoku z płaską powierzchnią do drugiej metody działania, możesz użyć metody this overload metody RedirectToAction
.
protected internal RedirectToRouteResult RedirectToAction(
string actionName,
string controllerName,
object routeValues
)
RedirectToAction
przekształci przedmiotu przekazana (routeValues) w ciągu zapytania i dodać, że w adresie URL (generowany z pierwszej 2 parametrami mijanych) i osadzi wynikowy adres w nagłówku odpowiedzi location .
Załóżmy Twój widok model jest jak ten
public class StoreVm
{
public int StoreId { get; set; }
public string Name { get; set; }
public string Code { set; get; }
}
A ty w swoim pierwszym sposobie działania, można przekazać obiekt tego sposobu RedirectToAction
jak ten
var m = new Store { StoreId =101, Name = "Kroger", Code = "KRO"};
return RedirectToAction("Details","Store", m);
Ten kod wyślij odpowiedź 302 do przeglądarki z wartością nagłówka lokalizacji:
Zakładając, że parametr metody działania Details
jest typu StoreVm
, wartości paramerty będą poprawnie odwzorowane na właściwości parametru.
public ActionResult Details(StoreVm model)
{
// model.Name & model.Id will have values mapped from the request querystring
// to do : Return something.
}
Powyższe będzie działać w celu uzyskania małego modelu z płaskimi łapami. Ale jeśli chcesz przekazać skomplikowany obiekt, powinieneś postąpić zgodnie ze schematem PRG.
PRG Wzór
PRG oznacza POST - przekierować - GET. Dzięki takiemu podejściu, wyślesz odpowiedź przekierowania z unikalnym identyfikatorem w querystringu, za pomocą którego druga metoda akcji GET może ponownie wysłać zapytanie do zasobu i zwrócić coś do widoku.
int newStoreId=101;
return RedirectToAction("Details", "Store", new { storeId=newStoreId});
To stworzy url Store/Details?storeId=101
iw swoim działaniu Szczegóły GET
, używając storeId przekazany, dostaniesz/zbudować obiekt StoreVm
skądś (z usługą lub przeglądając bazę danych itp)
public ActionResult Details(string storeId)
{
// from the storeId value, get the entity/object/resource
var store = yourRepo.GetStore(storeId);
if(store!=null)
{
// Map the the view model
var storeVm = new StoreVm { Id=storeId, Name=store.Name,Code=store.Code};
return View(storeVm);
}
return View("StoreNotFound"); // view to render when we get invalid store id
}
TempData
po PRG pattern jest lepszym rozwiązaniem do obsługi tego przypadku użycia. Ale jeśli nie chcesz tego zrobić, a naprawdę chce przejść kilka skomplikowanych danych w bezpaństwowców HTTP wniosków, można korzystać z niektórych tymczasowego mechanizmu przechowywania jak TempData
TempData["NewCustomer"] = model;
return RedirectToAction("Index", "Users");
i czytać w swoim sposobie działania ponownie GET
.
public ActionResult Index()
{
var model=TempData["NewCustomer"] as Customer
return View(model);
}
TempData
wykorzystuje Session
obiekt za sceną do przechowywania danych. Ale po odczytaniu danych dane są przerywane.
Rachel napisał ładny blog post wyjaśniający, kiedy należy użyć TempData/ViewData. Warto przeczytać.
Korzystanie TempData do przekazania danych modelu na żądanie przekierowania w ASP.NET Rdzenia
w ASP.NET rdzenia, nie można przechodzić złożone typy w TempData. Możesz przekazywać proste typy, takie jak string
, int
, Guid
itp.
Jeśli chcesz całkowicie przekazać obiekt złożony za pośrednictwem TempData, masz 2 opcje.
1) Serializuj swój obiekt do ciągu znaków i przekazuj go.
Oto przykład przy użyciu Json.NET do serializacji obiektu do łańcucha
var s = Newtonsoft.Json.JsonConvert.SerializeObject(createUserVm);
TempData["newuser"] = s;
return RedirectToAction("Index", "Users");
Teraz w Index
metody działania, przeczytaj tę wartość z TempData i deserializować go do obiektu CreateUserViewModel
klasy.
public IActionResult Index()
{
if (TempData["newuser"] is string s)
{
var newUser = JsonConvert.DeserializeObject<CreateUserViewModel>(s);
// use newUser object now as needed
}
// to do : return something
}
2) Ustaw słownika typów prostych do TempData
var d = new Dictionary<string, string>
{
["FullName"] = rvm.FullName,
["Email"] = rvm.Email;
};
TempData["MyModelDict"] = d;
return RedirectToAction("Index", "Users");
i przeczytać ją później
public IActionResult Index()
{
if (TempData["MyModelDict"] is Dictionary<string,string> dict)
{
var name = dict["Name"];
var email = dict["Email"];
}
// to do : return something
}
Wziąłem proste podejście jak to => powrót widzenia ("ActionName ", Model); – xameeramir