Загрузка пользовательских элементов управления программически в заполнитель (ASP.NET)
-
27-09-2019 - |
Вопрос
На моей странице .aspx у меня есть;
<%@ 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>
В моем aspx.vb у меня есть;
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
Результатом является пустой заполнитель и без ошибок.
Большое спасибо за любую помощь
PS После ответа Fat_tony я изменил код;
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
Но все еще никаких результатов к сожалению.
Решение
Вместо того, чтобы объявить ваш USERCONTROL в качестве типа «Control», объявите его как имя класса, которое вы указали в вашем файле usercontrol.ascx:
<%@ Control className="MyUserControl" %>
Таким образом, в вашем коде на странице .aspx:
Dim objControl as ASP.MyUserControl = CType(LoadControl("~\Controls\MyUserControl.ascx"), ASP.MyUserControl)
Больше информации доступно на MSDN.
Редактировать: Проверьте файл кодового файла для вашего пользовательского управления и обратите внимание на пространство имен и имени класса. Когда я создал свой контроль пользователя, он был автоматически добавлен в пространство имен, который содержал имя папки, а также пространство имен приложения.
Затем, в вашем .aspx.vb, замените «ASP.ContentModule» с «nameSpace.Classname» из вашего файла .ascx.vb. Кроме того, убедитесь, что вы все еще вызываете метод Добавить на ваш заполнитель.
Мой пример в C #, но я могу поставить в VB, если вам нужно. Мое приложение было удобно названо «Tester».
ASCX код-позади:
namespace Tester.modules
{
public partial class content : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
Код ASPX-позади:
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);
}
}
}
Другие советы
Я не знаю VB слишком хорошо, но вам не нужно объявить контроль, чтобы быть усердным, а не просто контролировать? например, попробуйте изменять
Dim loadmodule As Control
К
Dim loadmodule As UserControl