一般Web程序是通过HttpContext.Current.Server.MapPath("~")得到当前web的物理路径。
在设计时HttpContext.Current是null, 此路不通,用来判断是否是设计状态倒是不错。
Web控件在设计时会被实例化,但仅仅是实例化,不会为它设定相关Web环境,比如Page。
看样用常规方法行不通。控件在设计时能得到哪些资讯呢?Site! 这个小东西在设计时非空,但是。。。从文档上看,也没什么可用的东西。
为什么图片控件在设计时就能够选择当前Web下的相对路径呢?好像是个专用Designer.看来要和DTE相关。
http://blogs.msdn.com/mszcool/archive/2004/06/30/169793.aspx
上面的blog中讲解了如果调用DTE。这样得到当前项目的绝对路径只要几行代码:
public static string GetProjectPath()
{
EnvDTE.DTE devenv = (EnvDTE.DTE)Marshal.GetActiveObject("VisualStudio.DTE.7.1");
string projectFile = devenv.ActiveDocument.ProjectItem.ContainingProject.FileName;
System.IO.FileInfo info = new System.IO.FileInfo(projectFile);
return info.Directory.FullName;
}
{
EnvDTE.DTE devenv = (EnvDTE.DTE)Marshal.GetActiveObject("VisualStudio.DTE.7.1");
string projectFile = devenv.ActiveDocument.ProjectItem.ContainingProject.FileName;
System.IO.FileInfo info = new System.IO.FileInfo(projectFile);
return info.Directory.FullName;
}
原文用devenv.ActiveSolutionProjects.GetValue(0)来得到当前项目。在控件设计时,有可能在项目管理器上选中的其它项目,这样得到的就不是当前编辑页面所在的项目。