4

我听说每个人都建议在用户提交表单(HTTP POST)后重定向用户(HTTP GET)。它很干净,没有“你想重新发送”警报,很简单......

但是,如果我想向用户显示一些结果怎么办?

好的,我可以向 GET url 添加一些参数,例如“/?message=1”,然后检查那个 parameter.orm

但是,如果我想显示更多信息怎么办?例如,用户提交表单,结果是一个简单的结构,比方说......我想向用户显示 5 个不同的属性。

比如,“您在购物车中添加了一个产品,这里还有其他 5 个其他产品也添加了。”。现在,这被简化了,不要告诉我“啊,只需传递 ?productId=xy 然后根据该 ID 执行另一个查询”。

我应该坚持使用 POSTBACK 模型吗?

假设用户是匿名的并且没有启用 cookie。

4

4 回答 4

4

这就是 TempData 的用途。它专门且仅适用于您重定向的情况。像 ViewData 一样使用它,除了它可以在重定向中存活。

于 2009-03-09T19:58:24.510 回答
3

像这样的东西怎么样:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string something) {
    if (something == "example") {
        ViewData["Something"] = something;
        ViewData["SOmethingElse"] = 23;
        return View("MyView");
    } else {
        return View("MyView");
    }
}

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
    return View("TheForm");
}

第一种方法将处理您的发布事件,您可以根据需要将数据传入其中并返回。第二种方法将处理操作的初始获取请求。注意动作的 AcceptVerbs 属性。

此选项不会更改 URL。如果您希望更改 url,您唯一的选择是使用查询字符串。

于 2009-03-09T18:47:49.440 回答
2

当发布成功时,在您的控制器中为用户保留一个事务标识符(您可以为此使用 ASP.NET 配置文件提供程序)并重定向到已完成的页面 (GET)。

在您已完成的页面 GET 处理程序中,您可以查找用户的最后一个事务 ID,并根据此显示您想要的内容。

“交易标识符”是一些标识符,您以后可以参考它来查找交易的详细信息。

这是我正在考虑的 URL 序列:

  1. GET /orders/create - 显示表格
  2. POST /orders/create - 验证并创建订单(订单 ID == 10),重定向到 /orders/details/{orderId}
  3. GET /orders/details/10 - 查找订单 10,显示订单和与之相关的任何额外信息
于 2009-03-09T19:44:19.617 回答
0

您想使用 TempData["mykey"]=ObjectIWantToUseOnTheNext Page。

有关更多信息,请参阅此博客文章:

http://blogs.teamb.com/craigstuntz/2009/01/23/37947/

于 2009-03-12T22:50:55.793 回答