我有一个Web应用程序项目,它具有以下结构
ProjectName
-Controls
--WebControls
--MyControl.ascx
-CustomerControls
--CustDetails.ascx
在CustDetails.ascx控件中我试图加载MyControl.ascx,所以我在页面上添加了一个引用(不是代码隐藏),即
<%@ Register Src="../Controls/WebControls/MyControl.ascx" TagPrefix="Ctrl" TagName="CustCtrol" %>
页面加载时没有错误。
我现在将以下代码添加到codebehind
LoadControl = Page.LoadControl("MyControl.ascx");
但我收到 &#34;文件&#39; /MyControl.ascx'不存在。&#34;
我尝试将路径更改为
~/Controls/WebControls/MyControl.ascx
但同样的错误。将其更改为
../Controls/WebControls/MyControl.ascx
然后得到&#34; 不能使用前导..退出顶级目录。&#34;
我尝试过变种并搜索谷歌,但我无法理解我哪里出错了?
编辑1
答案 0 :(得分:1)
注意这里的目录结构:
项目名
- 控制
- 器WebControls
- MyControl.ascx
它说MyControl.ascx在Controls目录中,而不是WebControls。
您有两个选择:
1)将MyControl.ascx移动到WebControls目录,重建解决方案,这些代码将起作用:
<%@ Register Src="~/Controls/WebControls/MyControl.ascx" TagPrefix="ctrl" TagName="CustControl" %>
和
LoadControl = Page.LoadControl("~/Controls/WebControls/MyControl.ascx");
2)将它保存在您列出的目录中(Controls目录中的MyControl.ascx),并将上述代码中的路径更改为:
<%@ Register Src="~/Controls/MyControl.ascx" TagPrefix="ctrl" TagName="CustControl" %>
和
LoadControl = Page.LoadControl("~/Controls/MyControl.ascx");
无需使用Server.MapPath。
此外,如果在类后面的MyControl代码中定义了公共方法或属性,则需要将加载的控件强制转换为MyControl,以便像访问此处一样访问这些方法和属性:
LoadControl = Page.LoadControl("...") as MyControl;
//or
LoadControl = (MyControl)Page.LoadControl("...");