4 Stimmen

Web Forms User Control Nullfelder beim Laden

Ich versuche, ein älteres ASP.NET-System zu migrieren. Web-Site Projekt zu einem Web-Anwendung Projekt in VS2010. Es scheint meist zu funktionieren, aber ich finde, dass Benutzerkontrollen en .ascx Dateien haben alle ihre eigenen Steuerelemente auf Null gesetzt.

Ich vermute, dass es etwas damit zu tun hat, wie ich Deklarationen in den aspx-Dateien verwende, die die Steuerelemente benötigen, aber ich bin mir nicht sicher. Ich habe eine Beispieldatei und -seite erstellt und kann das Problem reproduzieren. Die ursprüngliche Website wurde dynamisch kompiliert, aber ich versuche, sie in eine einzige DLL zu verwandeln, da sich ohne eine neue Bereitstellung nichts ändern wird.

Kann jemand einen Grund, warum die "TheTextBox" würde null auf Page_Load der Benutzer-Steuerelement, und mögliche Lösung sein?

ASCX-Datei steuern 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" />  

Steuerung 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?
        }
    }
} 

Steuerung 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, die das Steuerelement enthält 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, die das Steuerelement CodeFile enthält 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 : Wie vorgeschlagen, ersetzen Sie die WebForm-Direktive durch

<%@ Register Src="~/ascx/WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="prefix" %>

führt zu einem schönen gelben Bildschirm des Todes:

CS0260: Fehlender partieller Modifikator bei der Deklaration des Typs 'PSVOnline.Ascx.WebUserControl1'; eine andere partielle Deklaration dieses Typs existiert

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;

3voto

Doozer Blake Punkte 7577

Normalerweise, wenn ich ein Benutzer-Steuerelement zu registrieren, anstelle von dem, was Sie auf WebForm1.aspx habe ich sie wie folgt registrieren:

<%@ Register Src="~/WebUserControl1.ascx" TagName="control" TagPrefix="uc" %>

Ich weiß nicht, ob das das Problem ist, das Sie haben, aber das sieht nicht nach der typischen Art und Weise aus, wie man ein Benutzersteuerelement registriert.

0 Stimmen

Ich habe diesen Ansatz mit den fraglichen Benutzerkontrollen verfolgt. Im Fall der migrierten Anwendung beschwerten sich die Benutzerkontrollen über doppelte Klassen. Dies schien zu passieren, weil das Steuerelement in die Site-DLL kompiliert wurde und die ALSO bei der Ausführung erneut kompiliert wurde. Die einzige Möglichkeit, die ich mir vorstellen konnte, war, es in einer separaten Klasse zu haben, was ich noch nicht ausprobiert habe.

0 Stimmen

Dieser Beitrag hat mich gerettet, ich habe nur dummerweise die Kontrollerklärung vergessen :)

0voto

Yildiray Meric Punkte 660

Ich habe die Lösung gefunden

Der folgende Ansatz funktioniert perfekt

http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X