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

时间:2013-11-26 10:54:36

标签: c# asp.net-mvc

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(...)的原因。

2 个答案:

答案 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)。