加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在ASP.NET MVC中重定向后发布

发布时间:2020-12-16 07:14:42 所属栏目:asp.Net 来源:网络整理
导读:我在ASP.NET MVC应用程序中使用 Redirect After Post模式.我有 以下场景: 用户进入/ controller / index,要求他填写表格. 表单值被POST到/ controller / calculate. Calculate操作根据输入执行计算,并实例化包含操作结果的复杂对象.此对象存储在TempData中,
我在ASP.NET MVC应用程序中使用 Redirect After Post模式.我有
以下场景:

>用户进入/ controller / index,要求他填写表格.
>表单值被POST到/ controller / calculate.
> Calculate操作根据输入执行计算,并实例化包含操作结果的复杂对象.此对象存储在TempData中,用户被重定向到/ controller / result.
> / controller / result从TempData检索结果并将其呈现给用户.

这种方法的问题在于,如果用户在查看/ controller / result中的结果时点击F5,则由于TempData已过期且结果对象不再可用,因此无法再呈现页面.

用户不希望出现这种行为.一种可能的解决方案是在POST之后重定向,而不是渲染结果视图.现在,如果用户点击F5,他会得到一个浏览器对话框,询问他是否要重新发布表单.这也是不希望的.

我想到的一个可能的解决方案是序列化结果对象并在重定向之前将其传递给URL,但AFAIK对GET请求的长度有一些限制,如果对象变得很大,我可能会遇到这种限制(特别是如果base64编码) ).

另一种可能性是使用Session对象而不是TempData来持久保存结果.但在实施此解决方案之前,我想知道是否有更好的方法.

更新:

进一步研究这个问题我发现如果我将结果对象重新放在/ data / result动作中的TempData中,它实际上是有效的:

public ActionResult Result()
{
    var result = TempData["result"];
    TempData["result"] = result;
    return View(result);
}

但这感觉很脏.这种方法是否会产生任何副作用(例如切换到进程外会话提供程序,因为目前我使用的是InProc)?

解决方法

使用一些唯一键将其存储在会话中,并将密钥作为URL的一部分传递.然后,只要会话处于活动状态,他们就可以使用后退/前进按钮来查看其内容,并且仍然可以正确响应URL.或者,您可以使用ASP缓存,但我通常会为用户共享的对象保留该缓存.当然,如果您使用计算参数作为键,并在缓存中找到结果,则可以简单地重复使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读