1

我有一个系统,其中包含在 ASP.net MVC 中构建的许多表单,这些表单旨在通过 iframe 跨多个第 3 方网站使用。每个第 3 方站点都分配有一个唯一的 URL,例如

http://iframedomain.com/iframe/f9a14f53-0528-4ad1-b451-8895360e57e4

控制器检查 Guid 是否有效,以及是否有分配给它的自定义 css 文件的路径。如果有,则此自定义 css 存储在 Session 变量中 - css 文件都位于 iframe 所在域的内容/样式中的子文件夹中。然后用户被重定向到正确的表单。

每个表单控制器都继承自一个通用控制器,其中有一个 OnActionExecuting 覆盖,它将自定义 css 传递到 VIewBag:

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Session["iFrameCSS"] != null)
        {
            ViewBag.iFrameCSS = Session["iFrameCSS"];
        }

        if (Session["JQueryTheme"] != null)
        {
            ViewBag.JQueryTheme = Session["JQueryTheme"];
        }

        base.OnActionExecuting(filterContext);
    }

然后布局文件会对此进行检查并导入正确的 CSS 文件:

@if (ViewBag.iFrameCSS != null)
{
    string cssFile = ViewBag.iFrameCSS.ToString();
    if (cssFile.StartsWith("http", StringComparison.CurrentCultureIgnoreCase))
    {
        <link rel="stylesheet" href="@cssFile" type="text/css" media="screen, projection" />
    }
    else
    {
        <link rel="stylesheet" href="@Url.Content("~/Content/style/" + cssFile + ".css")" type="text/css" media="screen, projection" />
    }
}
else
{
    <link rel="stylesheet" href="no-custom-css-file.css" type="text/css" media="screen, projection" />
}

这在所有浏览器中都可以正常工作,除了 IE(在 7/8/9 测试),其中没有指向 css 文件的链接,并且使用了默认的 css 文件。我已经在本地进行了调试,并在 IE 中看到了不同的结果,其中 Session 工作正常并且肯定设置了 ViewBag 变量,但这根本无法在实时服务器上工作。我看不出这里有什么问题?我已经在 4 台不同的机器上进行了测试(4 个不同的人,他们的设置非常不同,结果都一样)

4

1 回答 1

1

也许这是跨域会话 cookie 的问题。设置 P3P 标头应该可以解决它。SO上有很多关于P3P的问题。

如果 iframe 与父级位于不同的域中,则它们是 3rd 方 cookie,并且在 Internet Explorer 和 Safari 中默认设置它们有一些限制。

Macros 通过使用 cookieless 会话解决了他的问题。

于 2012-05-28T16:46:18.150 回答