重定向到另一个网站时使用隐藏字段

Using Hidden Fields When Redirecting to Another Website

提问人:IrishChieftain 提问时间:7/28/2023 最后编辑:IrishChieftain 更新时间:8/5/2023 访问量:165

问:

使用 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 - 上面的代码片段已更新。

asp.net HTTP 重定向 WebForms 表单身份验证

评论

0赞 pcalkins 7/28/2023
似乎您需要为“{0}”提供一个值。.所以像这样:Response.Write(sb.ToString(), “您的值”); ?(顺便说一句,你可能想把它全部保留在 POST......只需将重定向页面添加为隐藏字段即可...查询参数似乎很混乱。
0赞 IrishChieftain 7/28/2023
@pcalkins1你能用代码示例来回答吗?不知道你的意思到底是不是。
0赞 pcalkins 7/28/2023
“{0}”是变量 methinks 的占位符......所以你需要把它设置为一些东西......现在你有 Response.Write(sb.ToString());没有发送任何变量...
1赞 IrishChieftain 7/28/2023
@pcalkins,value='{0}' 被替换为 Uri.EscapeDataString(value1),如下所述:learn.microsoft.com/en-us/dotnet/api/...我已经在生成的 HTML 中确认了这一点。
1赞 pcalkins 7/29/2023
明白了。。。我的错。

答:

0赞 Ghulam Farid 8/5/2023 #1

问题是您实际上并没有在网站 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 中。然后,您可以对这些值执行一些操作,例如在页面上显示它们或将它们存储在数据库中。