ASP.NET - 缺少#includes导致编译错误:无法映射路径'...'

时间:2010-05-26 00:10:49

标签: asp.net visual-studio-2008 include compilation server-side-includes

我有一个ASP.NET应用程序,它具有一些服务器端包含。例如:

<!--#include virtual="/scripts.inc" -->

我的ASP.NET网站项目中没有这些文件,因为我的网站在虚拟目录中启动:

  

/路径到我的应用

当我选择构建网站时,我收到此错误:

  

无法映射路径'/scripts.inc'

Visual Studio无法解析在根目录级别定义的这些包含文件。它们在网站项目中不可见。

除了手动注释#include引用外,有什么方法可以让我的网站建立起来吗?我可以强制Visual Studio忽略这些错误并编译网站吗?

将网站推送到IIS后,没有问题,因为所有#include文件都已到位。

注意 - Web控件不是此应用程序的选项。请假设#include文件是必需的。此外,我无法移动包含文件,因为它们被其他应用程序使用。

4 个答案:

答案 0 :(得分:0)

尝试使用〜/语法来表示应用的根目录。 e.g。

<!--#include virtual="~/scripts.inc" -->

答案 1 :(得分:0)

试试这个:

将.aspx文件中的SSI指令替换为:

<asp:Literal runat="server" id="scriptsIncLiteral" />

并将其放入代码隐藏中:

protected override void OnPreRender(EventArgs e)
{
    string scriptsFile = Request.MapPath(".") + @"..\scripts.inc";
    scriptsIncLiteral.Text = System.IO.File.OpenText(scriptsFile).ReadToEnd();
}

如果scripts.inc文件位于多个目录中,您当然必须更改..\的数量。您还必须确保您的ASP.NET Web应用程序可以访问此文件,否则您将获得System.UnauthorizedAccessException

答案 2 :(得分:0)

您可以在Visual Studio中设置预构建任务,以便在每次在实际构建之前构建项目时将include文件复制到项目目录中。虽然这是一个黑客。

更正确的方法是设置一个包含两个项目的解决方案:一个代表您的Web服务器的根目录/一组与您的项目交互的应用程序(通过包含共享文件)。另一个将代表您陷入困境的项目。然后你应该将你的inc文件包含在(作为文件中包含在项目中)到第一个项目中,以使它们对第二个项目可见并允许它包含(如在ASPX中的服务器端包含)它们。

这是一种更麻烦的方式,但它更密切地反映了你的情况,没有黑客,并且可以为你带来更多的奖励功能(比如更容易整合/代表连接项目)。

答案 3 :(得分:0)

您是否可以复制包含文件,将它们放在您的开发计算机上的解决方案中,然后告诉VS不要复制那些构建输出(Build Action = None)?

如果没有,为什么不简单地将整个链接编码到scripts.inc文件(http://oursite.com/scripts.inc)。 Sucky可以解决,但我很确定你不能忽略编译错误(但警告是的)。