【问题标题】:Good ASP.NET MVC pattern for form submit and immediate result display用于表单提交和即时结果显示的良好 ASP.NET MVC 模式
【发布时间】:2009-03-09 18:41:03
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc postback return-value


    【解决方案1】:

    这就是 TempData 的用途。它是specifically, and only, for the case where you are redirecting。像 ViewData 一样使用它,除了它可以在重定向中存活。

    【讨论】:

    • 我也在想同样的事情,并认为这正是他所追求的。除了他说它必须与禁用 cookie 和 IIRC 一起工作,TempData 需要会话,而会话又需要 cookie...?
    • 会话也可以使用查询字符串参数进行跟踪:msdn.microsoft.com/en-us/library/ms178581.aspx
    • 正确的 Charlino,它必须在禁用 cookie 的情况下工作,并且 TempData 依赖于 Session 状态,而后者又依赖于 cookie(除了无 cookie 设置,但那是另一回事)。
    • Craig - 当然可以,但是使用 MVC?有人吗?
    • 我没有一起尝试过 MVC+cookie-less-Sessions,但如果它不起作用,那就是错误,恕我直言。 MVC 旨在支持会话。 (是否/多少使用它们是一个不同的问题......)
    【解决方案2】:

    这样的事情怎么样:

    [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,您唯一的选择是使用查询字符串。

    【讨论】:

    • 请多解释一下。不要忘记,用户没有 cookie,并且在 POST 之后我正在执行 GET 到另一个页面。
    • 如果我按F5,我会得到“你要重新提交”的提示吗?
    • 是的,你会的。据我所知,没有一种解决方案可以同时解决您的两个要求。您要么必须使用 cookie,要么使用查询字符串变量,要么允许可能的重新发布。
    【解决方案3】:

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

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

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

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

    1. GET /orders/create - 显示表单
    2. POST /orders/create - 验证并创建订单(订单 ID == 10),重定向到 /orders/details/{orderId}
    3. GET /orders/details/10 - 查找订单 10,显示订单以及与之相关的任何额外信息

    【讨论】:

      【解决方案4】:

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

      查看这篇博文了解更多信息:

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

      【讨论】:

        猜你喜欢
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-17
        • 2018-03-25
        • 1970-01-01
        相关资源
        最近更新 更多