像重定向一样使用 View 的正确代码是什么?



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月)。

相关内容

最新更新