asp.net 重定向到其他网站时使用隐藏字段

ajsxfq5m  于 2023-08-08  发布在  .NET
关注(0)|答案(1)|浏览(109)

使用C# Web Forms,我尝试使用隐藏字段作为从网站A重定向到网站B的一部分(同一个域,两个网站都使用Forms身份验证进行密码保护)。我尝试过不同的approaches,但到目前为止,我无法从网站B Login代码隐藏中的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页_加载:

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页_加载:

当我将网站B上的Response.Write(Request.Form[“Val 1”].ToString())更改为Response.Write(Request.Form[“Val 1”])时,我不再得到空引用异常。因此,我将网站B上的测试代码替换为以下代码,其中键的长度显示为0:

string[] keys = Request.Form.AllKeys;
Response.Write(keys.Length.ToString()); //Displays 0

更新二:

使用浏览器工具,似乎在代码中创建的HTML没有出现在生成的HTML中。我开始怀疑这可能与我12年前处理过的一个问题相似,当时ASP.NETWeb Forms不允许嵌套窗体。还在调查

更新3

我忘了说我在ASPX页面上使用了一个链接按钮--上面的代码片段已经更新了。

nnt7mjpx

nnt7mjpx1#

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

相关问题