使用C#编程以编程方式实现操作PostBackUrl

3

你能在页面的代码后台获取PostBackUrl的操作吗?

我想调用一个onclick函数,该函数执行一些数据库更新,然后将值作为隐藏字段发布到不同的URL。

4个回答

3
我会使用server.Transfer。然而,隐藏字段非常不安全。因此,在其位置上(并且由于您已经在使用server.transfer),为什么不使用Context.Items?您可以通过它传输整个对象。例如:这是在原始页面上 -
Context.Items.Add("Contact", contactID)
        Server.Transfer("~/ViewContact.aspx")

在生成的页面上,你需要 -
Dim contactID = Context.Items.Item("Contact").ToString()

当使用server.transfer时,您必须非常小心,因为传输发生在服务器上,从不通知浏览器页面与所请求的页面不同。如果您没有预料到这一点,那么当您尝试进行postbacks时,可能会遇到麻烦。
我实际上刚刚写了一篇关于这个问题的博客... Server.Transfer示例

这是一个很好的想法,但 URL 仍将保持不变(?) - 我真的很想看到它“移动”到下一页。 - ComfortablyNumb
1
阅读您的原始文本,实际上您并不想要进行后台提交(postback),而只是向一个新页面发帖(post)。因此,用户填写表单,您执行数据库操作...然后(使用那些数据)您会发帖到一个新页面。如果您不介意,我建议您使用自3.5 SP1以来就已经可用的路由(Routing)功能。即使它是安全的,您也可以对数据进行加密。请谨慎使用ViewState,因为它曾被攻击过。 - cgcarter1
如果您只是要发布到新页面...只需使用Response.Redirect,然后使用Page History。然后,您可以获取先前页面的字段句柄。 - cgcarter1

2
您可以创建一个简单的白色页面,包含一个表单和您想要发布的所有输入内容,并使用JavaScript进行发布。但是,当用户未启用JavaScript时,问题就出现了。对于这种情况,在这个简单的白色页面中,您需要包含一条消息,告诉用户该页面将在几秒钟内自动重定向到其他页面,或者点击此处立即重定向。
这个简单的白色页面只是单击后正常页面的覆盖。您还可以阅读本文中提到的类似技巧,以便将表单数据发送到另一个URL,并附带源代码和示例。还有许多其他方法在ASP.NET网页之间传递值
当您需要从您的页面转移到支付网关提供商(例如PayPal)时,通常会出现这种情况。另一种解决方案是创建一个包含要发送到下一页的摘要和所有数据的页面,并在该页面中包含正常的提交到网关的摘要。
当单击按钮时,您需要运行一个函数(在代码后台中)。完成该函数后,您希望代码后台将隐藏字段值发布到不同的页面。当您的函数完成后,您不能使用提交返回到另一个页面。您可以做的是将一个包含您需要发送到其他页面的隐藏输入数据的简单表单呈现给您的页面,并自动发布此新表单。
以下是示例:
protected void Button1_Click(object sender, EventArgs e)
{
   // ...you calculations here...

    StringBuilder sbRenderOnMe = new StringBuilder();

    // the form and the data
    sbRenderOnMe.AppendFormat(
    "<html><body><form action=\"http://www.google.com\" method=\"post\" name=\"form1\">"
         + "<input value=\"{0}\" id=\"lst-Send1\" name=\"Send1\" type=\"hidden\" />"
         + "<input type=\"submit\" name=\"Button1\" value=\"press me if not automatically redirect\" id=\"Button1\" />"
     + "</form>"
     , 1100
    );

    // the auto submit
    sbRenderOnMe.AppendFormat("<script>document.form1.submit();</script>");       
    sbRenderOnMe.AppendFormat("</body></html>");

    Response.Write(sbRenderOnMe.ToString());
    Response.End();
}

唯一的缺点是有轻微闪烁,且没有自动工作功能,需要告知用户按下按钮。

谢谢您的回复,但是也许我没有表达清楚。无论JavaScript如何,当单击按钮时,我需要运行一个函数(在代码后台)。一旦该函数完成,我希望代码后台使用隐藏字段值发布到不同的页面。(类似于PostBackUrl) - ComfortablyNumb
基本上,我正在尝试提交购物车内容,但在页面转到订单页面之前运行我的重新计算购物车函数。我对C#还很陌生,老实说,我不理解提供的示例。 - ComfortablyNumb
@ComfortablyNumb,这就是我在这里向您展示的内容。请再次阅读以理解我提出(和使用)的方法。 - Aristos
@ComfortablyNumb,我写了一些代码示例,你看到了吗?我已经测试过它并且可以工作,得到了谷歌的错误页面 :) - Aristos

0

当你完成原始的代码后端事件之后,你可以使用Server.Transfer来保留表单和查询字符串变量。

Server.Transfer("OtherPage.aspx", true);

Server.Transfer没有发送@ComfortablyNumb请求的新帖子值。请使用包含新帖子数据的不同URL进行请求。这两种方法在Server.Transfer中都失败了。 - Aristos
当您使用“Server.Transfer”时,“Request.Form”集合将保留原始帖子中的值。您可以通过设置一个简单的测试项目来检查这一点。 - Yiğit Yener
是的,我有原始帖子,但这里需要发送不同的帖子! - Aristos

0

我找到了这个解决方案

<asp:LinkButton ID="CartOrderButton" runat="server" PostBackUrl="order.aspx" onclick="CartOrderButton_Click">Order Me</asp:LinkButton>

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