提问人:IrishChieftain 提问时间:7/28/2023 最后编辑:IrishChieftain 更新时间:8/5/2023 访问量:165
重定向到另一个网站时使用隐藏字段
Using Hidden Fields When Redirecting to Another Website
问:
使用 C# Web 窗体,我尝试使用隐藏字段作为从网站 A 重定向到网站 B 的一部分(同一域,两个站点都使用表单身份验证进行密码保护)。我尝试了不同的方法,但到目前为止,我无法从网站 B 登录代码隐藏中的 Request.Form NameValueCollection 中提取隐藏字段值,并且在尝试访问请求表单密钥时出现空引用异常。
网站A:
<asp:LinkButton ID="redirectLink" runat="server" OnClick="RedirectLink_Click"
OnClientClick="window.document.forms[0].target='_blank';">New Page - Website B
</asp:LinkButton>
Response.Clear();
StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.Append("<body onload='submitForm()'>");
sb.AppendFormat("<form id='customForm' action='{0}' method='post'>", url + "/newpage.aspx?redirectPage=NewPage_Redirect");
sb.AppendFormat("<input type='hidden' name='Val1' value='{0}' id='Val1'>", Uri.EscapeDataString(value1));
sb.AppendFormat("<input type='hidden' name='Val2' value='{0}' id='Val2'>", Uri.EscapeDataString(value2));
sb.Append("</form>");
sb.Append("<script>");
sb.Append("function submitForm() {");
sb.Append("document.getElementById('customForm').submit();");
sb.Append("}");
sb.Append("</script>");
sb.Append("</body>");
sb.Append("</html>");
Response.Write(sb.ToString());
HttpContext.Current.ApplicationInstance.CompleteRequest();
网站 B Page_Load:
if ((Request.QueryString["redirectPage"] != null)
&& (Request.QueryString["redirectPage"].ToString() == "NewPage_Redirect"))
{
Response.Write(Request.Form["Val1"].ToString()); // NULL REFERENCE EXCEPTION
Response.Write(Request.Form["Val2"].ToString());
}
我错过了什么?
更新 1
网站A:
这是我在 VS 2022 中看到的 HTML:
<html>
<body onload='submitForm()'>
<form id='customForm' action='https://websiteB.com/newpage.aspx?redirectPage=NewPage_Redirect' method='post'>
<input type='hidden' name='Val1' value='abc123' id='Val1'>
<input type='hidden' name='Val2' value='def456' id='Val2'>
</form>
<script>
function submitForm()
{
document.getElementById('customForm').submit();
}
</script>
</body>
</html>
网站 B Page_Load:
当我更改 Response.Write(Request.Form[“Val1”] 时。ToString()) 到网站 B 到 Response.Write(Request.Form[“Val1”]),我不再收到空引用异常。因此,我将网站 B 上的测试代码替换为以下内容,该代码显示 0 表示密钥长度:
string[] keys = Request.Form.AllKeys;
Response.Write(keys.Length.ToString()); //Displays 0
更新2:
使用浏览器工具,在代码中创建的 HTML 似乎没有出现在生成的 HTML 中。我开始怀疑这可能就像我 12 年前处理过的一个问题,其中 ASP.NET Web 窗体不允许嵌套窗体。仍在调查中。
更新 3
我忘了提到我在 ASPX 页面上使用了 LinkButton - 上面的代码片段已更新。
答:
问题是您实际上并没有在网站 A 上提交表格。您只是为表单生成 HTML,然后显示它。这意味着隐藏字段实际上并未发送到网站 B。
要解决此问题,您需要实际提交表单。为此,可以将以下代码添加到 RedirectLink_Click 事件处理程序中:
// Create the form object.
Form form = new Form();
// Add the hidden fields to the form.
form.AddHiddenField("Val1", value1);
form.AddHiddenField("Val2", value2);
// Submit the form.
form.Submit();
这将实际提交表单,隐藏字段将被发送到网站 B。
提交表单后,您可以访问网站 B 上Page_Load事件处理程序中的隐藏字段值。以下代码将向您展示如何执行此操作:
string val1 = Request.Form["Val1"];
string val2 = Request.Form["Val2"];
// Do something with the hidden field values.
此代码将获取隐藏字段的值,并将它们存储在变量 val1 和 val2 中。然后,您可以对这些值执行一些操作,例如在页面上显示它们或将它们存储在数据库中。
评论