Cargando controles de usuario mediante programación en un marcador de posición (asp.net)
-
27-09-2019 - |
Pregunta
En mi página .aspx que tengo;
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" AspCompat="True" %>
<%@ Register src="Modules/Content.ascx" tagname="Content" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:PlaceHolder ID="Modulecontainer" runat="server"></asp:PlaceHolder>
</div>
</form>
</body>
</html>
En mi aspx.vb tengo;
Try
Dim loadmodule As UserControl
loadmodule = Me.LoadControl("~/modules/content.ascx")
Modulecontainer.Controls.Add(loadmodule)
Catch ex As Exception
Response.Write(ex.ToString & "<br />")
End Try
El resultado es un marcador de posición vacío y no hay errores.
Muchas gracias por cualquier ayuda
P.S después de la respuesta de Fat_Tony me cambió el código para;
Try
Dim loadmodule As ASP.ContentModule
loadmodule = CType(LoadControl("~\Modules\Content.ascx"), ASP.ContentModule)
Modulecontainer.Controls.Add(loadmodule)
Catch ex As Exception
Response.Write(ex.ToString & "<br />")
End Try
Sin embargo, aún no hay resultados, lamentablemente.
Solución
En lugar de declarar su control de usuario como tipo "Control", declara como el nombre de clase especificado en el archivo de Usercontrol.ascx:
<%@ Control className="MyUserControl" %>
Así que en su código subyacente en la página .aspx:
Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)
Más información disponible en MSDN .
EDIT: Compruebe el archivo de código subyacente para el control de usuario y tomar nota del espacio de nombres y el nombre de clase que están ahí. Cuando creé mi control de usuario, se agrega automáticamente a un espacio de nombres que contenía el nombre de la carpeta, así como el espacio de nombres de la aplicación.
A continuación, en su .aspx.vb, reemplazar "ASP.ContentModule" con "Namespace.ClassName" de su archivo .ascx.vb. Además, asegúrese de que todavía está llamando el método Add en el marcador de posición.
Mi ejemplo es en C #, pero puedo aguantar en VB si es necesario. Mi solicitud fue nombrado convenientemente "Tester".
código subyacente ASCX:
namespace Tester.modules
{
public partial class content : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
ASPX de código subyacente:
namespace Tester
{
public partial class _Default : System.Web.UI.Page
{
private Namespace.ClassName loadmodule;
protected void Page_Load(object sender, EventArgs e)
{
loadmodule = (Namespace.ClassName)LoadControl("~/modules/content.ascx");
Modulecontainer.Controls.Add(loadmodule);
}
}
}
Otros consejos
No sé VB demasiado bien, pero no tiene que declarar el control para que sea un control de usuario y no sólo de control? p.ej. Intente cambiar
Dim loadmodule As Control
a
Dim loadmodule As UserControl