Controller类(在System.Web.Mvc中)上的一个View方法允许您将模型传递到不同的视图。然而,它不会将url更新为新视图的名称,因为这种方法更像Server.Transfer,而不是Response.Redirect。关键是,这种行为可能会让任何学习MVC的人感到困惑。因此,在调用View方法之后,我希望重写url路径,以反映新视图的名称。我在一个实现Controller类的类上尝试了以下操作,但没有成功:
public ViewResult ViewAsRedirect(string viewName, object model)
{
var baseView = base.View(viewName, model);
ControllerContext.HttpContext.RewritePath(baseView.ViewName);
return baseView;
}
实现我所描述的内容的正确代码是什么?
编辑
任何RedirectToAction方法都不允许将模型发送到另一个操作。有一种肮脏的解决方法,在退出一个操作之前将其存储在TempData中,并在另一个操作开始时检索。我不想用这种模式。这就是我使用View(…)的原因。
您根本无法"更新URL"(即重定向)和返回内容。
如果您希望新的URL显示与您预期的内容相同的内容,那么您需要(临时)存储结果,并包括您希望在重定向的URL上显示的资源的标识符。
在那里,您可以再次从控制器中提取重定向URL的资源,并将其显示在相应的视图中。
因此,如果您将object model
POST到/Foo/Create
,例如,您可以将model
存储在数据库中,从而生成ID:42
。然后你可以重定向到/Foo/View/42
,并显示它
如果你能解释你实际上想做什么,就可以给出一个更具体的答案。
RedirectToAction
在我看来非常直观。。。您应该使用MVC控制器的重定向方法之一:Redirect(url)
、RedirectToAction(acion)
、RedirectToAction(acion, controller)
等等
示例
public class HomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
return View();
}
public ActionResult Redirect()
{
return this.RedirectToAction("Index");
}
}
编辑
如果您的操作需要收集大量数据以传递到视图,则可以通过检测重定向条件,并根据简单的路由数据(如数据库ID或简单的strigs或数字)加载其他操作中的所有数据,尽早进行重定向。
===OR===
当页面加载时,您可以在客户端呈现javascript代码来更改URL:在不重新加载页面的情况下修改URL这只适用于最近的浏览器(当前日期2013年11月)。