我正在尝试在asp.web站点中动态加载用户控件。但是由于asp.net网站项目的设置(我认为),我无法访问达到用户控件的类型定义。
我收到一条消息,说我的类HE_ContentTop_WebControl1是:他找不到类型或命名空间名称'HE_ContentTop_WebControl1'(你是否缺少using指令或程序集引用?)
知道如何才能使它工作?我试图使用命名空间,但在我看来,asp.net网站默认情况下不适用于命名空间。我会对非命名空间方法感兴趣。
TIA
public partial class HE_Default :
System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e)
{
var control = (HE_ContentTop_WebControl1)Page.LoadControl("~/ContentTop/WebControl1.ascx");
}
}
答案 0 :(得分:10)
假设控件存在于与Web项目相同的程序集中,则需要在.aspx文件中添加引用指令,
e.g:
<%@ Reference Control="~/Controls/WebControl1.ascx">
请记住,智能感知通常需要花费几分钟(或有时是构建版本)来进行选择。
答案 1 :(得分:7)
可以使用命名空间轻松完成。这是一个例子:
WebControl1.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="MyUserControls.WebControl1" %>
请注意继承引用命名空间(MyUserControls),而不仅仅是类名(WebControl1)
WebControl1.ascx.cs:
namespace MyUserControls
{
public partial class WebControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
请注意,该类已包含在命名空间MyUserControls
中Default.aspx.cs:
using MyUserControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var control = (WebControl1) Page.LoadControl("~/WebControl1.ascx");
}
}
这种方法可能允许您重新分发用户控件(或将它们保存在单独的项目中),而无需在.aspx文件中引用它们。
答案 2 :(得分:4)
网站模型不支持命名空间。因此,我无法获得任何提议的解决方案。但是,有一个解决方案。创建一个接口并将其放入应用程序代码中,然后在用户控件中实现该接口。你可以转换到接口,它可以工作。
答案 3 :(得分:3)
这篇文章的主题有点误导。如果您只想动态添加控件,则不必引用该控件,因此您只需添加一些简单的控件即可:
protected void Page_Load(object sender, EventArgs e)
{
Page.Controls.Add(Page.LoadControl("~/MyControl.ascx"));
}
没有任何命名空间。
答案 4 :(得分:2)
使用
引用是不够的<%@ Reference Control="~/Controls/WebControl1.ascx">
aspx文件中的只是答案的一部分。
您还需要在User Control aspx文件中添加calssName
<%@ Control ClassName="WebControl1" Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="AnySpaceName.DateSelector" %>
然后你可以在你的aspx文件中使用userontrol
AnySpaceName.WebControl1 WC = (AnySpaceName.WebControl1)Page.LoadControl("~/WebControl1.ascx");
答案 5 :(得分:1)
以这种方式强制转换用户控件可能会产生许多问题。我的方法是创建一个类(比如控件类),将所需的所有属性和方法放入其中并从System.Web.UI.UserControl继承此类然后在你的用户cotrol代码文件而不是System.Web.UI.UserControl用户这个控件类。
现在当你需要施法时,只使用这个类进行施法。它也将是轻型铸造。