ASP.NET服务器端控件将数据提交到自己的页面,而想要将用户重定向到外部页面并需要在该页面上进行提交(例如进行身份验证)时,这会带来不便。
HttpWebRequest
非常适合您不希望重定向的情况,而JavaScript在某些情况下也可以使用,但如果您确实需要从服务器端代码获取数据进行提交,则可能会变得棘手。
那么,在ASP.NET代码后台中既能够将数据提交到外部URL又能够将用户重定向到结果的方法是什么呢?
ASP.NET服务器端控件将数据提交到自己的页面,而想要将用户重定向到外部页面并需要在该页面上进行提交(例如进行身份验证)时,这会带来不便。
HttpWebRequest
非常适合您不希望重定向的情况,而JavaScript在某些情况下也可以使用,但如果您确实需要从服务器端代码获取数据进行提交,则可能会变得棘手。
那么,在ASP.NET代码后台中既能够将数据提交到外部URL又能够将用户重定向到结果的方法是什么呢?
这是我今天解决这个问题的方法。我从C# Corner上的这篇文章开始,但发现示例虽然在技术上正确,但有些不完整。他说的一切都是对的,但我需要访问一些外部站点才能将其拼凑到我想要的样子。
并没有帮助的是,用户根本没有提交表单;他们是点击链接进入我们的支持中心,但为了将他们登录,必须向支持中心的网站进行http post请求。
这个解决方案使用 HttpContext.Current.Response.Write()
来写入表单数据,然后在 <body onload="">
方法中使用一点Javascript来提交表单到正确的URL。
当用户点击支持中心链接时,会调用以下方法来编写响应并重定向用户:
public static void PassthroughAuthentication()
{
System.Web.HttpContext.Current.Response.Write("<body
onload=document.forms[0].submit();window.location=\"Home.aspx\";>");
System.Web.HttpContext.Current.Response.Write("<form name=\"Form\"
target=_blank method=post
action=\"https://external-url.com/security.asp\">");
System.Web.HttpContext.Current.Response.Write(string.Format("<input
type=hidden name=\"cFName\" value=\"{0}\">", "Username"));
System.Web.HttpContext.Current.Response.Write("</form>");
System.Web.HttpContext.Current.Response.Write("</body>");
}
这种方法的关键在于 JavaScript 的那个 onload 部分,当页面主体加载完成时,它会提交表单,然后将用户重定向回我的主页。这个奇妙的部分的原因是我在新窗口中启动外部网站,但不希望用户在刷新页面时重新提交隐藏的表单。此外,这个隐藏的表单会将页面下移几个像素,这让我很烦恼。
如果有更好的想法,我非常感兴趣。
Eric Sipple
我建议你使用HttpWebRequest类在代码后台中进行表单提交。以下是一个很好的帮助类来帮助你入门:
<链接>
从那里开始,你可以直接执行Response.Redirect操作,或者根据提交的结果来改变你的操作(例如如果出现错误,向用户显示错误信息等)。实际上,我认为你已经在问题中找到了答案 - 听起来像是需要进行post或redirect操作,但实际上它们都可以在代码后台中完成。
我需要在同一窗口中打开页面,并处理原始页面可能存在的框架问题,然后在代码后面重定向到外部网站:
Private Sub ExternalRedirector(ByVal externalUrl As String)
Dim clientRedirectName As String = "ClientExternalRedirect"
Dim externalRedirectJS As New StringBuilder()
If Not String.IsNullOrEmpty(externalUrl) Then
If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then
externalRedirectJS.Append("function CheckWindow() {")
externalRedirectJS.Append(" if (window.top != window) {")
externalRedirectJS.Append(" window.top.location = '")
externalRedirectJS.Append(externalUrl)
externalRedirectJS.Append("';")
externalRedirectJS.Append(" return false;")
externalRedirectJS.Append(" }")
externalRedirectJS.Append(" else {")
externalRedirectJS.Append(" window.location = '")
externalRedirectJS.Append(externalUrl)
externalRedirectJS.Append("';")
externalRedirectJS.Append(" }")
externalRedirectJS.Append("}")
externalRedirectJS.Append("CheckWindow();")
Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True)
End If
End If
End Sub