c# - ASP.Net c# - 如何从 App_Code 类中实例化 WebUserControl 的实例?

标签 c# asp.net webusercontrol

你好,

我有一个自定义控件,我需要从类中实例化它并将其添加到页面中。我的类(class)有一个函数,我将 Page 传递给它,这样我就可以访问页面上的控件。我正在使用这种方法来添加标准的 ASP 控件,并且一切都按预期工作。我的问题是自定义控件的类型是已知定义的?

我读了here将 .cs 从控件移动到 App_Code 文件夹,但是当我这样做时,它不会编译,因为它看不到 ascx 中的控件有效。例如,我得到 CS0103: The name 'litTest' does not exist in the current context。因为它们是分部类,所以我在 App_Code 文件夹中创建了一个新的空分部类,并单独保留控件的 .cs 文件。

好吧,它是这样编译的,但是当我将控件添加到 Page.controls 集合时,我没有在页面上看到任何它应该在的地方。例如,我将 TEST 添加到 ascx 文件的底部,但我在页面上看不到它。此外,该控件具有我需要设置的变量,在使用空分部类时我无权访问这些变量。

我知道我正在尝试使用标准控件进行操作,但为什么我似乎无法使用自定义控件进行操作?

我在 App_Code 文件夹中的部分类:

public partial class CustomControlClass : System.Web.UI.UserControl
{

}

我的用户控件部分类:

public partial class CustomControlClass : System.Web.UI.UserControl
{
    private int _myValue= -1;
    public int myValue
    {
        get { return _myValue; }
        set { _myValue= value; }
    }
    protected void Page_Init(object sender, EventArgs e)
    {
        litTest.Text = "TEST";
    }
}

我的用户控件ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControlClass.ascx.cs" Inherits="CustomControlClass" %>
<asp:Literal ID="litTest" runat="server"></asp:Literal>
TEST

我的 App_Code 类:

public class MyClass
{
    public static void doWork(Page Ctrl)
    {
        CustomControlClass c = new CustomControlClass();
        //c.myValue = 1;  // Wont compile with this line
        Ctrl.Controls.Add(c);

        Literal l = new Literal();
        l.Text = "HELLO";
        Ctrl.Controls.Add(l);
    }
}

页面输出根本没有 TEST 这个词。 HELLO 这个词显示得很好。我尝试从页面 LoadInitPreInit 回调中调用 MyClass.doWork(),所有导致该死的事情。

更新:

正如 Minh Nguyen 所建议的那样,我可以使用 Ctrl.LoadControl("~/Controls/CustomControlClass.ascx"); 来加载控件,但我不能将其转换为它自己的类型我必须将它分配为控件类型:

Control c= Ctrl.LoadControl("~/Controls/CustomControlClass.ascx");

这样做可以让我将控件添加到页面并使其按预期工作。缺点是我无法访问任何控件属性。为了解决这个问题,我正在这样做:

c.GetType().GetProperty("myValue").SetValue(c, 1, null);

这行得通,但我不确定它的使用成本。我希望我可以直接转换控制,但我在尝试时遇到错误。

我暂时不回答这个问题,看看是否还有其他选择。

最佳答案

使用

CustomControlClass c = (CustomControlClass)Ctrl.LoadControl("~/VirtualPathToASCX/CustomControlClass.ascx");

代替

CustomControlClass c = new CustomControlClass();

更新:修复转换错误

//LoadControl
ASP.customcontrolclass_ascx c = (ASP.customcontrolclass_ascx)this.LoadControl("~/Controls/CustomControlClass.ascx");
//set myValue
c.myValue = 3;

你在 VS 自动完成列表中看不到 ASP.customcontrolclass_ascx 类型,但它编译没有错误。

关于c# - ASP.Net c# - 如何从 App_Code 类中实例化 WebUserControl 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940446/

相关文章:

C# HttpWebRequest问题

c# - 获取 Web 项目引用的类库项目中的相对文件路径

c# - 有没有办法提高我的简单文本过滤器的性能?

c# - 在 MVC 5 的 Controller 中访问声明值

c# - 从用户控件调用父页面中的方法

javascript - 在 aspx 页面中使用 aspx 用户控件的多个实例

c# - 如何将文本字符串数组的数量限制为 15

c# - 防止 chrome 使用电子邮件/密码自动填充字段?

asp.net - 将虚拟目录映射到 App_Data 中的子文件夹以提供图像是否安全?

javascript - JavaScript 中的 CheckBox onClick 事件是否有其他替代方法?