Ответ 1
Проблема в том, что Safari не позволяет устанавливать cookie в iframe, если пользователь не взаимодействует с этим iframe. Для некоторых это означает щелчок по ссылке. Я нашел лучшее решение, которое должно сделать перенаправление.
Во-первых, я помещаю эту форму на свою страницу. Фактически, я помещал его в главную страницу, которая используется каждым представлением, поданным в iframe.
<% if(SecurityHelper.BrowserIsSafari) { %>
<% using (Html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new { id="safari-fix-form" })) { %>
<%: Html.Hidden("safariRedirectUrl")%>
<% } %>
<% } %>
Поскольку я только хочу, чтобы это работало, когда пользователь использует сафари, я создал это свойство в статическом вспомогательном классе, чтобы проверить useragent
public static bool BrowserIsSafari
{
get { return HttpContext.Current.Request.UserAgent.ToLower().IndexOf("safari") >= 0; }
}
Затем в моем контроллере у меня есть следующее действие
[HttpPost]
public ActionResult SafariRedirect(string safariRedirectUrl)
{
Response.Cookies.Add(new HttpCookie("safari_cookie_fix", "cookie ok"));
return Redirect(safariRedirectUrl);
}
На моей главной странице в заголовке у меня есть мой script, объявленный в том же операторе if, который определяет, отображается ли форма. В моем файле script у меня есть этот jquery
$(function () {
if ($.browser.safari == true && document.cookie.indexOf("safari_cookie_fix") == -1) {
var url = location.href;
$('#safariRedirectUrl').val(url);
$('#safari-fix-form').submit();
}
});
В первый раз, когда iframe загружает страницу, если это сафари, и cookie не установлен, форма отправляется, набор файлов cookie и пользователь перенаправляется обратно на тот же URL.