我有一个登录屏幕。当登录失败时,我不想回到相同的屏幕,如下所示:
return View(model);
我想用以下内容将我带到另一个屏幕:
return RedirectToAction("Index", "Home");
但我怎样才能通过该模型?我看到了一些建议,但这些建议与MVC2有关。 MVC3有一些新功能可以让我这样做吗?
答案 0 :(得分:1)
使用RedirectToAction方法基本上是调用Repsonse.Redirect(Server.Transfer,我总是让那些混淆......但无论如何)。为了使ViewModel获得重定向的操作,您必须在URL字符串中发送模型的参数
return RedirectToAction("Index", "Home", new {prop1 = something, prop2 = something...etc});
但是,没有理由不利用TempData字典来维护ViewModel而不是在URL参数中传递它。
TempData["ViewModelItem"] = myViewModel;
Return RedirectToAction("Index", "Home");
public ActionResult Index(){
var model = (ViewModelType)TempData["ViewModelItem"];
}
注意上面的代码没有考虑您想要做的TempData项目的空引用或类型检查。
答案 1 :(得分:0)
您可以使用MVCContrib强类型重定向来执行操作:link
public ActionResult PayWithCreditCard(int id, Buyer user)
{
return this.RedirectToAction<AuctionController>(x => x.Pay(user, id));
}
答案 2 :(得分:-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