Visual Studio和ASP.Net Path问题

时间:2010-02-12 01:57:06

标签: asp.net visual-studio-2008

在Visual Studio中工作时的路径问题。在我的母版页中,我有一些加载css文件和javascript文件的路径。

我的第一个问题是,如果我使用相对路径,相对路径是否应该来自母版页文件的位置?例如,如果我将所有主页文件保存在名为MasterPages的站点根目录下的文件夹中,我应该假设这是我加载css文件的相对路径的起点吗?如果该母版页用于包装一个aspx文件,树下的几个目录是硬编码的相对路径仍然有效吗?

第二个问题,有没有办法使用绝对路径,以便一切都可以在我的本地机器上运行,以及当我将文件移动到webroot时?例如,我的本地计算机上的应用程序路径可能是localhost / myappdir / default.aspx,但是当我将应用程序移动到服务器时,没有myappdir,而default.aspx位于webroot中。我不想在将文件移动到服务器后更改文件中的路径。

目前我有..

src =“<%= VirtualPathUtility.ToAbsolute(”〜/ lib / css / style.css“)%>”

但这样Visual Studio无法找到更新intellisence的css文件

4 个答案:

答案 0 :(得分:1)

如果你使用css / Javascript文件的相对路径,那么它们需要相对于页面,而不是主页面。

This article能很好地解释你在这种情况下的选择,最后他们为这类问题提出了一个很好的解决方案,一个为你呈现脚本或链接标记的用户控件并调用ResolveClientUrl以使路径正确。

答案 1 :(得分:0)

使用“〜”运算符解析与根相关的所有内容。切勿使用相对路径。即使我没有使用主题,我使用他们的语法通过创建一个文件夹结构来获得我的CSS文件的简单语法访问:App_Themes / Style / stylesheet.css然后在我的ASPX页面指令中我添加Theme =“Style”和我的CSS文件将自动解决 - 不完全是常规但非常有效:-)

<强>更新

要解析JS,您可以在主页面代码隐藏中使用以下内容:

string myScript = "js/footerFix.js";
Page.ClientScript.RegisterClientScriptInclude("myKey", myScript);

使用IIS7,您无需更改任何内容即可获得“多站点”行为;例如,您可以使用以下几个站点并通过URL访问它们,除了创建虚拟目录之外没有任何单独的配置:

本地主机/ PROJECT1
本地主机/项目2
本地主机/项目3

答案 2 :(得分:0)

通常,您应该始终使用服务器相对路径(例如,/ images /stuff.gif)。使用相对路径(如在../images/stuff.gif中)会使你每次都搞砸,就像试图依赖ASP.NET“Magic”一样,例如VirtualPathUtility.ToAbsolute和ResolveClientUrl。

有时,在服务器上,您需要在tilda前面添加该路径(如〜/ images / stuff.gif中所示),以便它能够正确导航ASP.NET要求您基于所有项目的虚拟目录英寸

当然,这也意味着您需要使用multisite设置开发框,以便将根目录更改为http://mysite.dev/,并确保所有服务器相​​对路径都能正常工作正确。 (使用VS.NET内置服务器在技术上也可以解决这个问题,但实际上,你想使用那个东西吗???)

答案 3 :(得分:0)

将您的脚本和样式表链接放在母版页的<head Id="headRegion" runat="server" />中。他们的src / href应该是在WebDev.WebServer(例如/ ProjectWeb)中运行时获得的绝对URL路径。

在Master Page OnPreRenderComplete()中,重写headRegion中的所有URL。

Visual Studio可以智能化您的脚本和css,并且可以在任何虚拟路径下部署项目。

protected override void OnPreRenderComplete( EventArgs e )
{
    base.OnPreRenderComplete( e );

    var root = Request.ApplicationPath;
    if (root == "/") {
        root = "";
    }

    foreach (Control c in headRegion.Controls) {
        if (c is HtmlLink) {
            HtmlLink hlink = c as HtmlLink;
            hlink.Href = ReplacePath( hlink.Href, root );

        } else if (c is LiteralControl) {
            var literal = c as LiteralControl;
            literal.Text = ReplacePath( literal.Text, root );
        }
    }
}

string ReplacePath( string content, string prefix )
{
    return content.Replace("/ProjectWeb", prefix );
}