2011-03-13 62 views
1

我有一個登錄屏幕。當登錄失敗,我不想回到同一屏幕是這樣的:MVC3 - 我如何通過RedirectToAction傳遞模型引用

return View(model); 

我想使用什麼是下面要帶我到另一個畫面:

return RedirectToAction("Index", "Home"); 

但是我怎麼能通過這個模型?我看到一些建議,但這些都與MVC2有關。是否有一些MVC3的新功能可以讓我做到這一點?

回答

-1

沒有必要將模型傳遞給RedirectToAction,因爲所有此方法所做的都是生成HTTP 301.這不等同於Server.Transfer。

您可以使用Html.Partial()來渲染一個通過特定模型或Html.Action()的公共控件[見:http://haacked.com/archive/2009/11/18/aspnetmvc2-render -action.aspx]

從正確設計之外直接調用控制器方法被認爲是另一種控制器方法。如果你想在多個控制器中重複使用一些常用的功能,那麼你應該將它重構爲一個單獨的實體(可能是一種服務)。


您可能還需要在刺輥看看13. PRG模式的數據修改: http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx

+1

如果RedirectToAction不是正確的做...什麼是?你如何「去另一個控制器/動作並通過視圖模型」? – BlueChippy 2011-05-20 08:21:45

0

可以使用MVCContrib強類型重定向到行動:link

public ActionResult PayWithCreditCard(int id, Buyer user) 
     { 
      return this.RedirectToAction<AuctionController>(x => x.Pay(user, id)); 
     } 
1

使用RedirectToAction方法基本上是調用Repsonse.Redirect(Server.Transfer,我總是把這些混在一起......但無論如何)。爲了獲得視圖模型來重定向的動作,你會送模型的參數中的URL字符串

return RedirectToAction("Index", "Home", new {prop1 = something, prop2 = something...etc}); 

然而,沒有任何理由,你不能利用過的TempData詞典的維護視圖模型和不要在URL參數中傳遞它。

TempData["ViewModelItem"] = myViewModel; 
Return RedirectToAction("Index", "Home"); 

public ActionResult Index(){ 
    var model = (ViewModelType)TempData["ViewModelItem"]; 
} 

注意上面的代碼不考慮空引用或鍵入檢查對TempData的項目,你會想這樣做。