@ Url.Content在发布后更改

时间:2012-04-12 06:23:39

标签: asp.net-mvc-3

在我的MVC3 Razor应用程序中,我将布局页面中的ajax称为

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>

当我在本地机器上运行它时,它工作得很好..但是在使用iis7发布后,我的ajax调用无效。当我在浏览器中选中查看源时,引用在发布前为<script src="/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>,在发布后为<script src="mvcapplication/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script> 。我很困惑为什么url会改变?

2 个答案:

答案 0 :(得分:1)

Url.Content(string contentPaht)使用VirtualPathUtility.ToAbsolute(string contentPath)方法创建绝对网址:

public string Content(string contentPath)
{
    if (string.IsNullOrEmpty(contentPath))
    {
        throw new ArgumentException(MvcResources.Common_NullOrEmpty, "contentPath");
    }
    if (contentPath[0] == '~')
    {
        return VirtualPathUtility.ToAbsolute(contentPath, 
               this.RequestContext.HttpContext.Request.ApplicationPath);
    }

    return contentPath;
}

如您所见,使用了Request.ApplicationPath,它代表了虚拟目录。 当参数contentPath不以~开头时,它会返回contentPath而不使用ToAbsolute(string contentPath)方法。

所以你可以尝试使用:

@Url.Content("/Scripts/jquery.unobtrusive-ajax.js")

修改:您还可以尝试更改默认路线:

routes.MapRoute(
    "Default",
    "NameVirtualDirectory/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

答案 1 :(得分:0)

因为在服务器上应用程序具有虚拟路径“mvcapplication”,即该应用程序驻留在虚拟目录“mvcapplication”中的IIS中。它与asp.net mvc无关,它是一个IIS设置。