Как опубликовать и перенаправить на внешний URL-адрес из ASP_Net?

ASP_NET серверные элементы управления возвращают данные на свою собственную страницу. Это делает случаи, когда вы хотите перенаправить пользователя на внешнюю страницу, но по какой-то причине (например, для аутентификации) вам нужно сделать публикацию на этой странице, болезненными.
Отлично работает HttpWebRequest
, если вы не хотите перенаправлять, и JavaScript тоже хорош в некоторых случаях, но может оказаться сложным, если вам действительно нужен код на стороне сервера для сбора данных для публикации.
Так как же вам одновременно разместить сообщение на внешнем URL-адресе и перенаправить пользователя к результату из вашего кода ASP_NET codebehind?
6 ответов
Вот как я решил эту проблему сегодня. Я начал с этой статьи на C# Corner, но нашел пример - хотя технически и правильный - немного неполным. Все, что он сказал, было правильно, но мне нужно было зайти на несколько внешних сайтов, чтобы собрать все это воедино и заставить работать так, как я хотел.

Не помогало и то, что технически пользователь вообще не отправлял форму; он нажимал на ссылку, чтобы перейти в наш центр поддержки, но для входа в систему ему нужно было сделать http-запись на сайте центра поддержки.
Это решение подразумевает использование HttpContext.Current.Response.Write()
для записи данных в форму, а затем использование небольшого количества Javascript в <body onload="">
методе для отправки формы на соответствующий 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>");
}
Ключ к этому методу — в том самом onload-куске Javascript, который при загрузке тела страницы отправляет форму, а затем перенаправляет пользователя обратно на мою домашнюю страницу. Причина этого куска hoodoo в том, что я запускаю внешний сайт в новом окне, но не хочу, чтобы пользователь повторно отправлял скрытую форму, если он обновит страницу. Плюс эта скрытая форма сдвинула страницу на несколько пикселей вниз, что действовало мне на нервы.
Мне было бы очень интересно услышать любые более чистые идеи по этому поводу.
Я начал с этого примера из CodeProject.
Затем вместо того, чтобы что-то добавлять на страницу, я позаимствовал из saalon (выше) и сделал Response.Write()
.
Я бы сделал публикацию формы в вашем коде с использованием класса HttpWebRequest. Вот хороший вспомогательный класс, с которого можно начать.
Оттуда вы можете просто сделать Response.Redirect
, или, возможно, вам нужно изменить свое действие в зависимости от результата поста (если была ошибка, отобразить ее пользователю или что-то еще). Я думаю, что у вас уже был ответ в вашем вопросе, если честно - звучит так, как будто вы думаете, что это пост ИЛИ перенаправление, когда на самом деле вы можете сделать и то, и другое из своего кода.
Я реализовал это, создав форму, которая автоматически публикует данные (используя JavaScript) на желаемом удаленном URL-адресе. Соберите всю необходимую информацию для публикации в постбэке веб-формы, а затем создайте HTML-код для формы удаленной публикации и отправьте его обратно клиенту.
Для этого я создал служебный класс, содержащий удаленный URL-адрес и коллекцию пар имя/значение для формы.
Кросс-страничная публикация будет работать, если вы являетесь владельцем обеих страниц, но не в том случае, если вам нужно разместить публикацию на другом сайте (например, PayPal).
Если вы используете ASP_NET 2_0, вы можете сделать это с помощью кросс-страничной публикации.
Редактировать: Я упустил тот факт, что вы спрашиваете о внешней странице. Для этого, я думаю, вам нужно, чтобы ваша страница ASP_NET сгенерировала HTML-форму, действие которой установлено на удаленном URL
, а метод установлен на POST
. (Используя кросс-страничный постинг, это может быть даже другая страница без пользовательского интерфейса, только скрытые элементы формы.) Затем добавьте немного javascript для отправки формы, как только результат постбэка будет получен на клиенте.
Мне нужно было открыть страницу в том же окне, устранить возможные проблемы с фреймом на исходной странице, а затем выполнить перенаправление на внешний сайт в коде:
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
Как настроить переключатель CSS
Я работаю над сайтом, который перейдет на новый стиль в установленную дату. Встроенный семантический HTML и CSS сайта, поэтому изменение должно потребовать только изменения ссылки CSS. Я работаю с дизайнером, которому нужно будет увидеть, как он выглядит, а также с клиентом, которому нужно будет просмотреть обновления контента в текущем виде, а также ход разработки нового вида. Я планирую использовать магическое значение строки запроса и/или ссылку javascript в нижнем колонтитуле, которая записывает cookie для выбора новой страницы CSS. Мы работаем в ASP_NET 3.5. Есть какие-нибудь рекомендации? Я должен упомянуть, что мы используем условные комментарии IE для поддержки IE8, 7 и 6. Я могу создать функцию, которая выполняет замену: <link href="Style/<% GetCssRoot() %>.css" rel="stylesheet" type="text/css" /> <!--[if lte IE 8]> <link type="text/css" href="Style/<% GetCssRoot()…
Я использую ColdFusion для заполнения шаблона, который включает в себя неупорядоченные списки HTML ( <ul> ы). Большинство из них не такие уж длинные, но некоторые имеют смехотворно большую длину и могли бы поместиться в 2-3 колонки Есть ли способ сделать это легко с помощью HTML, ColdFusion или, может быть, JavaScript (я принимаю решения jQuery)? Не стоит использовать слишком сложное тяжеловесное решение, чтобы сэкономить время на прокрутке. Этот плагин jquery вам чем-то полезен? Ознакомьтесь с плагином Columnizer jQuery. Итак, я откопал эту статью из A List Apart CSS Swag: Многоколоночные списки. Я в итоге использовал…
Как в JS использовать клавиатуру для перемещения в раскрывающимся меню
Как в JavaScript использовать клавиатуру для перемещения по опциям в раскрывающимся меню У меня есть специально созданный динамический раскрывающийся список на основе ajax [div]. У меня есть поле [ввода], которое; onkeyup , запускает поиск Ajax, который возвращает результаты в div и возвращается с помощью innerHTML . Все div имеют основные моменты onmouseover , поэтому типичный успешный поиск дает следующую структуру (простите за полукод): [input] [div id=results]…