我正在使用需要我向其发布表单数据的付款页面。我知道如何使用按钮的 PostBackUrl 属性将我的表单发布到不同的页面,并且我知道如何自动提交表单以便它在加载时回发给自己,但我不知道如何将两者结合起来。
我有一个表单,在 OnLoad 中设置了一堆隐藏字段的值以发布到支付页面。当它加载时,我希望它自动发布到付款页面,而无需用户单击按钮。如果我在 Page_Load 中设置 Form 的 Action 属性,我会收到“Validation of viewstate MAC failed”错误。我以前在修改服务器控制客户端的内容然后发回时看到过这种情况。但是在这里我设置了动作服务器端,我什至没有回发到页面,那么它如何验证视图状态呢?
我刚刚发现,如果我在页面上放置一个与我将 Action 设置为相同的 PostBackUrl 的 Button,这个错误就会消失并且它可以工作,所以我想这是一个解决方法,但是任何人都可以解释这个错误和/或建议在页面加载时将表单自动发布到不同 URL 的更好方法?
编辑:这是我目前拥有的测试代码:
中间页面:
<form id="form1" runat="server">
<asp:Repeater ID="rptPostData" runat="server">
<ItemTemplate>
<input type="hidden" name="<%# Eval("key") %>" value="<%# Eval("value") %>" />
</ItemTemplate>
</asp:Repeater>
<asp:Button ID="Button1" runat="server" Text=""
PostBackUrl="http://localhost:64545/Payment.aspx" Style="visibility:hidden"/>
</form>
代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) //(Should never post back)
{
//this.form1.Method = "post";
this.form1.Action = "http://localhost:64545/Payment.aspx";
Dictionary<string, string> postData = new Dictionary<string, string>();
postData.Add(_accountIDKey, "555555");
postData.Add(_amountKey, "125.75");
postData.Add(_referenceIDKey, Guid.NewGuid().ToString());
postData.Add(_accountDataKey, "{'FirstName':'John','LastName':'Sleevenstein','Address1':'123 Fake St.'}");
postData.Add(_returnUrlKey, Request.RawUrl); //This should be a receipt page
postData.Add(_hashKey, CreateHash(postData));
rptPostData.DataSource = postData;
rptPostData.DataBind();
ScriptManager.RegisterStartupScript(this, typeof(WebForm1), "PostScript", "document.form1.submit();", true);
}
}