Internet Explorer 7 + MVC 3 = 不良的网址?

3
这很奇怪。我这么说是因为在IE 8及以上版本(以及FF浏览器)中,由Html.ActionLink()生成的URL会创建正确格式的URL链接 -> http://mydomain.com/myapp/mycontroller/myaction,但是在运行兼容模式的IE7和IE8中,生成的URL链接是这样的 -> http:///myapp/mycontroller/myaction。这也会影响到使用Url.Content()的任何内容。
这是一个问题,因为我有用户还在坚持使用IE 7 (我也不明白)。此外,我们的Active Directory策略已经设置了一些(而非全部)用户使用强制将IE 8设置为兼容模式,且无法关闭。它还覆盖了兼容性元标记。
在MVC中我应该检查什么?是否需要查看web.config设置?
代码: Action links:
@Html.ActionLink("My Text", "Action", "Controller", new { Param1 = Model.Param1 }, new { @class = "linkButton" })

Url.Content:
Url.Content("~/Content/openHS.png")

更新: 我在PHP中找到了一个类似的处理此问题的项目:为什么IE7不能使用相对URL?

网络上还有一些其他文章提到可以使用<base>头标签。现在正在尝试这个方法。搜索关键词为“相对URL”、“Internet Explorer 7”。


当包含Html.ActionLink的页面被呈现时,页面源中的URL是什么样子的?它看起来像/Controller/Action还是像http://domain/app/controller/action的形式? - Andy Evans
展示一下你的Html.ActionLink()代码,我相信你在其中包含了域名。 - HaBo
@Andy:嗯……两个来源(在兼容模式和非兼容模式下的IE8)都渲染为/Controller/Action,但是浏览器却按照我上面说的来解释。 - Richard H
你的head标签中有一个base标签吗? - ZippyV
更新本应该包括基础代码,但我忘记将其标记为代码。现在已经修复。 至于您的问题:我已经尝试过了,但它没有包括域名。我仍在测试我的解决方案是否完全可行(包括使用Javascript),如果可以,我会发布它。 - Richard H
1个回答

1

这个可以运行。我在WinXP模式下测试过,使用兼容模式的IE 8以及Internet Explorer 8 IE 7模式、IE 9、IE9 Compat、FF 11。不会对我的现有JavaScript造成任何影响。

对于Razor:

@{
     string baseHref;

     if(this.Request.Browser.Type == "IE7" && !this.Request.UserAgent.Contains("Trident/5.0"))
     {
          baseHref = this.Request.Url.Scheme + "://" + this.Request.Url.Authority + Url.Content("~");
     }
     else 
     {
          baseHref = Url.Content("~");
     }
}

然后在 <head> 标签的顶部:

<meta http-equiv="X-UA-Compatible" content="IE=9;IE=8;" />
<meta charset="utf-8" />
<base href="@(baseHref)"/>

以上的解释如下:Trident/5.0是IE 9的兼容引擎,似乎允许IE9根据页面域而不是基础链接来解释相对链接。如果您愿意,我相信您可以删除Razor代码。这对我来说是一个兼容性补丁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接