.net Rufen Sie die Funktion in der Benutzersteuerung aus dem Code hinter der Seite auf




asp.net user-controls (7)

Fügen Sie dies hinter Deklarationen in Ihren Code ein

protected <solutionName>.<controlName> myControl1; /*C#*/

Hier ist myControl1 die ID Ihrer Benutzerkontrolle. Jetzt können Sie öffentliche Funktionen dieses Steuerelements aufrufen.

Jetzt ist das alles vereinfacht, aber hier geht es:

Ich habe ein Benutzersteuerelement, das nur aus einer einzigen * .ascx-Datei besteht. Das Steuerelement hat keinen Code-Behind: es ist nur ein Skript mit ein paar Funktionen, wie folgt:

<%@ Control Language="VB" EnableViewState="False" ClassName="MyControlType" %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>

Das ist die gesamte Datei. Ich kann dieses Steuerelement erfolgreich zu einer Aspx-Seite mit einem Markup wie folgt hinzufügen:

<%@ Register Src="~/path/to/Control.ascx" TagPrefix="aaa" TagName="MyControl" %>
...
<aaa:MyControl runat="server" id="MyControl1" />

Nun möchte ich MyFunction vom Code-Behind der Seite aus aufrufen:

Dim someString As String = MyControl1.MyFunction()

Leider kann ich das nicht tun. Stattdessen erhalte ich einen Kompilierfehler mit dem Effekt " 'MyFunction' is not a member of 'System.Web.UI.UserControl'. "

Ich habe es auch versucht:

Dim someString As String = DirectCast(MyControl1, MyControlType).MyFunction()

Und dann sagt mir der Compiler: " Type 'MyControlType' is not defined. "

Ich habe viel damit gespielt, und ich kann es einfach nicht funktionieren lassen. Alle Bemühungen, MyControl1 auf einen genaueren Typ zu konvertieren, sind fehlgeschlagen, ebenso wie andere Umgehungen. Ich vermute, das Problem ist, dass die Ascx-Datei ohne Code-Behind nicht in eine Assembly kompiliert werden kann, aber der Code-Behind möchte in eine Assembly kompiliert werden und daher wird der Compiler verwirrt, über welchen Typ das Steuerelement ist.

Was muss ich tun, um diese Funktion aufrufen zu können?

[bearbeiten]
Also muss ich einfach Code-Behind für die Benutzerkontrolle hinzufügen. Das wollte ich sowieso machen. Ich würde trotzdem gerne wissen, wie ich das machen kann, ohne dass ich einen brauche.


Seltsam funktioniert für mich.

Imports Microsoft.VisualBasic

Public Class MyControlType
    Inherits UserControl
End Class

.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="~/WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl"  %>
...
<aaa:MyControl runat="server" id="MyControl1"  />

.

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Dim someString As String = MyControl1.MyFunction()
    End Sub

End Class

.

<%@ Control Language="VB" EnableViewState="False"  %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>

Sie müssen Ihren VB-Code in der VB-Datei hinzufügen

Public Function MyFunction() As String
        Return "CalledMyFunction!"
    End Function

Hier ist was ich getan habe.

  1. Erstellen Sie eine neue Website.
  2. Hinzufügen eines neuen Web-Benutzersteuerelements - Stellen Sie sicher, dass Sie das Kontrollkästchen "Code in separate Datei speichern" in diesem Dialogfeld deaktivieren.
  3. Platzieren Sie die Funktion in dem generierten ASCX
  4. Registrieren Sie das Steuerelement in default.aspx und führen Sie es aus

Inhalt von WebUserControl.ascx

<%@ Control Language="VB" ClassName="WebUserControl" %>

<script runat="server"> Public Function MyFunction() As String Return "CalledMyFunction!" End Function </script>

Inhalt von Default.aspx


<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl" %>

<!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>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <aaa:MyControl runat="server" ID="mycontrolid" />
    <%
        Dim i As String = mycontrolid.MyFunction()
        Response.Write(i)
     %>
    </div>
    </form>
</body>
</html>

Das Problem hat damit zu tun, dass es keine Code-Behind-Datei gibt, die die Klasse definiert. Sobald Sie die öffentliche Funktion in eine Code-Behind-Datei einfügen, funktioniert es. Ich denke, ASP.NET behandelt diese Funktion mehr wie eine anonyme Funktion und nicht als eine tatsächliche Funktion in einer Klasse.

Das ist sowieso mein Gedanke.


Ich glaube, dass Sie von WebUserControl ableiten müssen.

Platzieren Sie in Ihrem .ascx-Steuerelement "Control" Folgendes:

Inherits = "WebApplication1.WebUserControl1"

Natürlich müssen Sie die richtigen Namen verwenden.


Stellen Sie sicher, dass das MyControl1-Objekt in Ihrem Code-Behind vom Typ MyControlType ist und als solches beim Aufrufen dieser Funktion gegossen wird. Der Compiler gibt an, dass es die Methode MyFunction () in der Basisklasse von UserControl nicht finden kann.





code-behind