【问题标题】:How do I implement the Post/Redirect/Get pattern in asp.net WebForms?如何在 asp.net WebForms 中实现 Post/Redirect/Get 模式?
【发布时间】:2009-05-28 06:51:55
【问题描述】:

所以我了解了 prg 模式的基础知识。但我还没有遇到过一种让任意数据可用于页面“get”实例的技术。

例如,我可能希望根据用户发起 PostBack 的操作向用户显示不同的反馈消息。

我一直在做的是发送一个标识符作为查询字符串参数。这工作正常,但它引入了书签问题,并且似乎不能很好地扩展。如果我需要发送所有的 ViewState 怎么办?

不幸的是,我目前与 WebForms 相关联,无法说服我的组织迁移到 mvc。

【问题讨论】:

    标签: asp.net post-redirect-get


    【解决方案1】:

    如果 POST 的字段在重定向之前被持久化,并且您需要在重定向之后访问该数据,我会在您提到的查询字符串上附加数据记录的标识符。您还可以指定请求的状态(用于显示消息等)。然后在 GET 页面上,您可以读出数据并对其进行任何操作。

    我没有看到任何其他方法来解决这个问题,因为通过 GET 获得的每个页面都无法访问前一页的 ViewState 等。

    使用Server.Transfer 将与在原始页面上处理 POST 具有相同的效果。

    您可以使用 Session 变量来存储 POST 数据,但这很糟糕。

    【讨论】:

    • 是的,我意识到这些信息需要被持久化。我正在寻找一种最佳的实现方式。据我了解,Server.Transfer 绕过了 prg 的“重定向”部分。
    • 在这种情况下实现持久性的唯一选择是在数据库或文件中存储/检索数据,或将数据存储在 Session 对象中。您可以存储一个对象来表示 POST 中的数据,尽管在 Session 中存储原始类型可能更有效。
    【解决方案2】:

    我认为您仍然可以在表单元素中使用 get 方法。 在这种情况下,您将无法以正常方式使用控件的 ID。但是您可以使用 Request.Params 集合来获取视图状态。

    更新:对不起,我又试了一次。并发现您可以通过代码隐藏中的 ID 访问您的服务器控件。喜欢:

    Response.Write(text1.Text)
    

    看例子:

    aspx 页面(仅表单元素):

    < form id="form1" runat="server" method="get">
    < div>
    < asp:TextBox ID="text1" runat="server" />
    < asp:Button ID="button1" runat="server" OnClick="buttonClick" />
    < div>
    < form>
    

    注意: 我在每个“

    页面背后的代码(仅按钮点击事件):

    protected void buttonClick(object sender, EventArgs e)
        {
            string text = Request.Params["text1"];
    
            Response.Write(text);
        }
    

    当您单击按钮时,网址将如下所示:

    http://localhost:1157/WebSite1/Default.aspx?__VIEWSTATE=%2FwEPDwUKMTkwNjc4NTIwMWRkoJEtEHZ8lHQ53QllSkz8ncpEw80%3D&__EVENTVALIDATION=%2FwEWAwKf%2BPPUCwKTjKGwCgKs34rGBvus9oxN%2FQkHlkzpKUEwrbxHLM6u&text1=ashish&button1=

    【讨论】:

    • 查询字符串的大小有限制,大约 2kb。视图状态几乎总是比这个大。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2012-03-06
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多