如何在asp.net WebForms中实现Post/Redirect/Get模式?

4
我了解prg模式的基础知识。 但是,我还没有遇到一种使任意数据可用于页面“get”实例的技术。
例如,根据用户发起的PostBack操作,我可能想显示不同的反馈消息。
我一直在使用查询字符串参数作为标识符发送,这可以正常工作,但会引入书签问题,并且似乎不太适合扩展。如果我需要发送所有ViewState会怎样呢?
不幸的是,我目前被束缚在WebForms上,并没有说服我的组织迁移到mvc。
2个回答

3
如果在重定向前POST的字段被持久化,并且您需要在重定向后访问这些数据,则可以像您提到的那样,在查询字符串上附加数据记录的标识符。您还可以为请求指定状态(用于显示消息等)。然后在GET页面上,您可以读取该数据并对其进行任何操作。
我看不出其他方法来解决这个问题,因为使用GET获取的每个页面都无法访问先前页面的ViewState等信息。
使用Server.Transfer将具有与处理原始页面上的POST相同的效果。
您可以使用会话变量来存储POST数据,但是这种方式不太好。

是的,我意识到信息需要持久化。我正在寻找一种最佳实现方式。据我所知,Server.Transfer绕过了prg的“重定向”部分。 - Ken Browning
我能想到的在这种情况下实现持久性的唯一选项是将数据存储/检索到数据库或文件中,或将数据存储在会话对象中。您可以存储代表POST数据的对象,但在会话中存储原始类型可能更有效。 - Andrew Corkery

0

我认为您仍然可以在表单元素中使用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);
    }

当您点击按钮时,URL 将如下所示:

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


查询字符串的大小有限制,大约为2kb。视图状态的大小几乎总是比这个要大得多。 - GlennG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接