Carregar o usuário controla programaticamente em um espaço reservado (ASP.NET)
-
27-09-2019 - |
Pergunta
Na minha página .aspx eu tenho;
<%@ 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>
No meu aspx.vb eu tenho;
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
O resultado é um espaço reservado vazio e sem erros.
Muito obrigado por qualquer ajuda
PS Após a resposta de Fat_tony, mudei o 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
Mas ainda não há resultados.
Solução
Em vez de declarar seu userControl como "Control", declare -o como o nome da classe que você especificou no seu arquivo userControl.ascx:
<%@ Control className="MyUserControl" %>
Então, em seu código-behind na página .aspx:
Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)
Mais informações disponíveis em Msdn.
Editar: verifique o arquivo de código-behind para o seu controle do usuário e anote o espaço para nome e o nome da classe que estão lá. Quando criei meu controle do usuário, ele foi adicionado automaticamente a um espaço para nome que continha o nome da pasta, bem como o espaço para nome do aplicativo.
Em seguida, no seu .aspx.vb, substitua "asp.contentModule" pelo "namespace.className" do seu arquivo .ascx.vb. Além disso, verifique se você ainda está chamando o método Add em seu espaço reservado.
Meu exemplo está em C#, mas posso colocar em VB, se você precisar. Meu aplicativo foi convenientemente chamado de "testador".
ASCX Code-Behind:
namespace Tester.modules
{
public partial class content : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
ASPX Code-Behind:
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);
}
}
}
Outras dicas
Não sei muito bem o VB, mas você não precisa declarar o controle para ser um UserControl e não apenas controlar? por exemplo, tente mudar
Dim loadmodule As Control
Para
Dim loadmodule As UserControl