2012-06-26 8 views
40

W poniższym numerze chciałbym podać numer viewmodel. Jak przekazać model do przekierowania?Jak dołączyć model z funkcją RedirectToAction?

ustawić punkt przerwania, aby sprawdzić wartości modelu w celu weryfikacji modelu jest poprawnie utworzony. Jest poprawny, ale wynikowy widok nie zawiera wartości znalezionych we właściwościach modelu.

// 
// model created up here... 
// 
return RedirectToAction("actionName", "controllerName", model); 

ASP.NET MVC 4 RC

+2

Wziąłem proste podejście jak to => powrót widzenia ("ActionName ", Model); – xameeramir

Odpowiedz

66

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 
}