ASP.NET服务器端控件回发到自己的页面。 这使您想要将用户重定向到外部页面,但由于某种原因(例如,用于身份验证)而需要将该页面发布到该页面的情况变得很痛苦。
如果您不想重定向,HttpWebRequest效果很好,在某些情况下JavaScript很好用,但是如果您确实确实需要服务器端代码来收集帖子的数据,则可能会变得棘手。
那么,如何既发布到外部URL,又将用户重定向到ASP.NET代码隐藏代码的结果?
这就是我今天解决此问题的方法。我从C#Corner上的这篇文章开始,但是发现了这个示例-尽管从技术上讲是合理的-有点不完整。他说的一切都是正确的,但是我需要访问一些外部站点才能将其组合起来以完全按照我的意愿工作。
用户根本就没有提交表单,这并没有帮助。他们正在单击链接以转到我们的支持中心,但必须将其记录在支持中心站点的http帖子中。
此解决方案涉及使用HttpContext.Current.Response.Write()编写表单的数据,然后在方法上使用一些Javascript将表单提交到正确的URL。
当用户单击支持中心链接时,将调用以下方法来编写响应并重定向用户:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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位,当页面正文加载时,该位会提交表单,然后将用户重定向回我自己的主页。造成这种不安全感的原因是,我在新窗口中启动了外部站点,但是如果用户刷新页面,则不希望用户重新提交隐藏的表单。加上这种隐藏的形式使页面下降了几个像素,这让我感到不安。
我会对任何对此有任何更清洁的想法感兴趣。
埃里克·西普尔
我从CodeProject的这个例子开始
然后,我没有添加到页面,而是从saalon借用了(上面)并做了Response.Write()。
我会使用HttpWebRequest类在您的代码后面进行表单发布。这是一个入门的好帮手课程:
http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx
从那里,您可以执行Response.Redirect,或者您可能需要根据帖子的结果更改操作(如果出现错误,则将其显示给用户或其他)。我认为您已经在问题中有了坦白的答案-听起来您认为这是帖子或重定向,但实际上您可以从后面的代码中同时进行操作。
我需要在同一窗口中打开,处理原始页面中可能的框架问题,然后使用后面的代码重定向到外部站点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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 |
为此,我呈现了一种将表单自动发布(使用JavaScript)到所需的远程URL的表单-在Web表单的回发中收集发布所需的任何信息,然后为远程发布的表单构建HTML并将其呈现回去给客户。
我为此构建了一个实用程序类,其中包含远程URL和表单的名称/值对的集合。
如果您同时拥有两个页面,则跨页面发布将起作用,但是如果您需要发布到另一个站点(例如,PayPal)则不会。
如果您使用的是ASP.NET 2.0,则可以跨页发布。
编辑:我错过了您问有关外部页面的事实。为此,我认为您需要使ASP.NET页生成一个HTML表单,该表单的操作设置为远程URL,方法设置为POST。 (使用跨页面发布,这甚至可以是没有UI的其他页面,只有隐藏的表单元素。)然后,在客户端上收到回发结果后,立即添加一些JavaScript以提交表单。