asp.net - mvc - Formularios web Control de usuario Campos nulos en carga
crear controles dinamicamente c# winforms (2)
Estoy intentando migrar un proyecto anterior de sitio web ASP.NET para convertirlo en un proyecto de aplicación web en VS2010. En su mayoría parece funcionar, sin embargo, estoy descubriendo que los controles de usuario en los archivos .ascx tienen todos sus controles establecidos como nulos.
Sospecho que tiene algo que ver con la forma en que estoy usando las declaraciones en los archivos aspx que necesitan los controles, pero no estoy seguro. Creé un archivo de muestra y una página y puedo reproducirlo. El sitio original se compiló dinámicamente; sin embargo, intento convertirlo en una sola DLL ya que nada cambiará sin una nueva implementación.
¿Alguien puede dar una razón por la cual el "TheTextBox" sería nulo en Page_Load del control del usuario, y la posible solución?
Controlar el archivo ASCX WebUserControl1.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl1.ascx.cs" Inherits="MyNamespace.Ascx.WebUserControl1" ClassName="MyNamespace.Ascx.WebUserControl1" %>
<asp:TextBox runat="server" ID="TheTextBox" MaxLength="128" />
Control ASCX CodeFile WebUserControl1.ascx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyNamespace.Ascx
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
// TheTextBox is null at this point. Why?
}
}
}
Control ASCX AutoGenerated Designer File WebUserControl1.ascx.designer.cs
namespace MyNamespace.Ascx {
public partial class WebUserControl1 {
/// <summary>
/// TheTextBox control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox TheTextBox;
}
}
WebForm que contiene el control WebForm1.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" Inherits="MyNamespace.WebForm1" Codebehind="WebForm1.aspx.cs" %>
<%@ Register NameSpace="MyNamespace.Ascx" Assembly="MyAssembly" TagPrefix="prefix" %>
<asp:Content ID="Content1" ContentPlaceHolderID="PageHead" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<prefix:WebUserControl1 runat="server" ID="IncludedControl" />
</asp:Content>
WebForm que contiene el control CodeFile WebForm1.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyNamespace
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
Editar : como se sugirió, reemplazando la directiva WebForm con
<%@ Register Src="~/ascx/WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="prefix" %>
da como resultado una hermosa Pantalla Amarilla de la Muerte:
CS0260: Falta el modificador parcial en la declaración de tipo ''PSVOnline.Ascx.WebUserControl1''; otra declaración parcial de este tipo existe
Line 129:
Line 130: [System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
Line 131: public class WebUserControl1 : global::MyNamespace.Ascx.WebUserControl1 {
Line 132:
Line 133: private static bool @__initialized;
Encontré la solución ...
Usar el siguiente enfoque funciona perfectamente ...
http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx
Normalmente, cuando registro un control de usuario, en lugar de lo que tienes en WebForm1.aspx, los registro de la siguiente manera:
<%@ Register Src="~/WebUserControl1.ascx" TagName="control" TagPrefix="uc" %>
No sé si ese es el problema que está teniendo, pero esa no parece la forma típica de registrar un control de usuario.