如何使用RedirectToAction包含模型?

在下面的RedirectToAction中,我想传递一个viewmodel 。 如何将模型传递给redirect?

我设置了一个断点来检查模型的值,以validation模型是否正确创build。 这是正确的,但结果视图不包含在模型属性中find的值。

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

ASP.NET MVC 4 RC

RedirectToAction向客户端浏览器返回一个302响应,因此浏览器会向响应的位置标头值中的url发送一个新的GET请求到达浏览器。

如果您尝试将简单的平坦视图模型传递给第二个操作方法,则可以使用RedirectToAction方法的此重载 。

 protected internal RedirectToRouteResult RedirectToAction( string actionName, string controllerName, object routeValues ) 

RedirectToAction会将传递的对象(r​​outeValues)转换为一个查询string,并将其附加到url(从我们传递的前两个参数中生成),并将结果urlembedded到响应的位置标题中。

假设你的视图模型是这样的

 public class StoreVm { public int StoreId { get; set; } public string Name { get; set; } public string Code { set; get; } } 

而在你的第一个动作方法中,你可以像这样RedirectToAction这个对象传递给RedirectToAction方法

 var m = new Store { StoreId =101, Name = "Kroger", Code = "KRO"}; return RedirectToAction("Details","Store", m); 

这段代码将发送一个302响应给浏览器,位置标题值为

 Store/Details?StoreId=101&Name=Kroger&Code=KRO 

假设您的Details操作方法的参数是StoreVmtypes,查询string参数值将正确映射到参数的属性。

 public ActionResult Details(StoreVm model) { // model.Name & model.Id will have values mapped from the request querystring // to do : Return something. } 

以上将为传递小平视图模型起作用。 但是如果你想传递一个复杂的对象,你应该尝试遵循PRG模式。

PRG模式

PRG代表POSTREDIRECTGET 。 使用这种方法,您将在查询string中使用唯一标识发出redirect响应,使用该方法,第二个GET操作方法可以再次查询资源并将某些内容返回给视图。

 int newStoreId=101; return RedirectToAction("Details", "Store", new { storeId=newStoreId} ); 

这将创buildurl Store/Details?storeId=101并且在您的Details GET操作中,使用传入的storeId,您将从某处(从服务或查询数据库等)获取/构buildStoreVm对象。

 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的

PRG模式之后是处理这种用例的更好的解决scheme。 但是,如果你不想这样做,并且真的想通过无状态的HTTP请求传递一些复杂的数据,你可以使用一些临时存储机制,如TempData

 TempData["NewCustomer"] = model; return RedirectToAction("actionName", "controllerName"); 

并再次读取您的GET操作方法。

 public ActionResult actionname() { var model=TempData["NewCustomer"] as Customer return View(model); } 

TempData使用场景后面的Session对象来存储数据。 但是一旦数据被读取,数据就被终止。

Rachel写了一篇很好的博客文章,解释何时使用TempData / ViewData。 值得一读。