Controller类中的一个View方法(在System.Web.Mvc中)允许您将模型传递到不同的视图。但是,它不会将url更新为新视图的名称,因为此方法更像Server.Tranfer而不是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(...)的原因。
答案 0 :(得分:1)
您根本无法“更新网址”(即重定向)和返回内容。
如果您希望新网址显示与您预期相同的内容,则您需要(暂时)存储结果并包含您希望在重定向的网址上显示的资源的标识符。
您可以再次从控制器中为重定向的URL提取资源,并将其显示在相应的视图中。
因此,如果您将object model
发布到/Foo/Create
,则可以将model
存储在数据库中,从而生成ID:42
。然后,您可以redirect到/Foo/View/42
,然后展示它。
如果你能解释你实际上想要做什么,可以给出一个更具体的答案。
答案 1 :(得分:1)
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:Modify the URL without reloading the page 这仅适用于最近的浏览器(当前日期nov / 2013)。