Проблема в том, что Safari не позволяет устанавливать cookie в iframe, если пользователь не взаимодействует с этим iframe. Для некоторых это означает переход по ссылке. Я нашел лучшее решение, которое заключается в том, чтобы сделать перенаправление.
Сначала я разместил эту форму на своей странице. На самом деле, я помещаю его в мастер-страницу, которая используется каждым представлением в iframe.
<% if(SecurityHelper.BrowserIsSafari) { %>
<% using (Html.BeginForm("SafariRedirect", "Framed", FormMethod.Post, new { id="safari-fix-form" })) { %>
<%: Html.Hidden("safariRedirectUrl")%>
<% } %>
<% } %>
Поскольку я хочу, чтобы это работало только тогда, когда пользователь использует safari, я создал это свойство в статическом вспомогательном классе для проверки 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);
}
На моей главной странице, в заголовке, мой сценарий объявлен в том же операторе if, который определяет, отображается ли форма. В моем файле сценария у меня есть этот 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.