我正在动态地将Web用户控件添加到页面。使用LoadControl
方法只需要一个指向.ascx
的虚拟路径就能很好地工作。然而,LoadControl
的过载需要一个类型和一个参数数组,这使我很头痛。使用LoadControl(Type,Object())以编程方式加载用户控件
Web用户控件按预期方式实例化,但Web用户控件中包含的控件为空,只要我尝试使用它们,就会收到异常。奇怪,因为它使用LoadControl
的第一个版本时正在工作。
该网站的用户控制,操作简单,具有Literal
控制:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="MyControl.ascx.vb" Inherits="MyControl" %>
<asp:Literal ID="myLiteral" runat="server"></asp:Literal>
控件代码背后:
Public Class MyControl
Inherits System.Web.UI.UserControl
Public Property Data As MyData
Public Sub New()
End Sub
Public Sub New(data As MyData)
Me.Data = data
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
myLiteral.Text = Data.ID ' The Literal is null, but ONLY when I use the second LoadControl() method!
End Sub
End Class
而且从.aspx
从中我想相关的代码动态加载控件:
Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
Dim x = LoadControl(GetType(MyControl), New Object() {New MyData With {.ID = 117}})
Page.Controls.Add(x)
' Using LoadControl("MyControl.ascx") works as expected!
End Sub
看起来你正在调用已经创建的对象的构造函数 - 这是如何工作的? – jmoreno 2016-05-19 01:04:07
@jmoreno由于构造函数只是一些额外的喧嚣的静态方法,它只是工作。 – 2017-05-04 10:29:57
下面是一个快速演示:http://ideone.com/IoqU2Z(大多数在线编辑器的代码失败,因为它需要一些安全需求,但它完全信任)。 – 2017-05-04 10:41:12