2012-01-16 4 views
5

Ho un controllo utente Web in cui sono presenti controlli che devono essere alimentati con alcuni dati da variabili o proprietà dalla pagina sottostante.Ottieni il valore variabile dal codice sottostante e utilizza il controllo della pagina aspx

<%@ Control Language="C#" AutoEventWireup="False" CodeFile="Header.ascx.cs" Inherits="Site.UserControls.Base.Header" %> 
<asp:Literal runat="server" Text='<%# Testing %>' id="ltrTesting" /> 

Codebehind

namespace Site.UserControls.Base 
{ 
    public partial class Header : UserControlBase 
    { 
     public string Testing = "hello world!"; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      //this.DataBind(); // Does not work 
      //PageBase.DataBind(); // Does not work 
      //base.DataBind(); // Does not work 
      //Page.DataBind(); // Does not work 
     } 
    } 
} 

ho letto questo argomento, ma non ci vorrà risolvere il mio problema, presumo che sia perché si tratta di un controllo utente e non una pagina. I want to get property value from code behind

+0

Perché non impostare invece il valore sui controlli dal codice sottostante? – Magnus

+0

@Magnus A causa della portabilità dei controlli, questa è ovviamente un'opzione ma è l'ultima opzione fuori da questo –

+0

ok .. portabilità come? – Magnus

risposta

12

Risolto questo, soluzione qui di seguito

Da quando ho usato un controllo utente Web in questo caso la solita gli scenari non funzionerebbero. Ma mettendo un DataBind nella pagina che controlla il controllo utente, o qualsiasi materpage nella catena sopra il controllo utente web il codice ha iniziato a lavorare

MasterPage codebehind di file ascx

public partial class MasterPages_MyTopMaster : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // Databind this to ensure user controls will behave 
     this.DataBind(); 
    } 
} 

, tutte le soluzioni suggerite di seguito funziona

<%@ Control Language="C#" AutoEventWireup="False" CodeFile="Header.ascx.cs" Inherits="Site.UserControls.Base.Header" %> 
1: <asp:Literal runat="server" Text='<%# DataBinder.GetPropertyValue(this, "Testing") %>' /> 
2: <asp:Literal runat="server" Text='<%# DataBinder.Eval(this, "Testing") %>' /> 
3: <asp:Literal runat="server" Text='<%# Testing2 %>' /> 

Codebehind di ascx

namespace Site.UserControls.Base 
{ 
    public partial class Header : UserControlBase //UserControl 
    { 
     public string Testing { get { return "hello world!"; } } 
     public string Testing2 = "hello world!"; 

     protected void Page_Load(object sender, EventArgs e) 
     { } 
    } 
} 

Grazie per l'ispirazione!

6

In genere non è possibile inserire scriplet nei controlli del server. Ma c'è una soluzione semplice: utilizzare un controllo semplice HTML:

<span id="ltrTesting"><%= this.Testing %></span> 
+0

Questa è una soluzione semplice ma, se dico, voglio usare controlli un po 'più avanzati come un webcontrol personalizzato che esegue il rendering solo se il valore assegnato non è nullo che non lo fa –

+1

Un controllo web che esegue il rendering solo se viene assegnato un determinato valore? Questa è un'intera serie separata di problemi –

+0

Adam, quello è già coperto e funzionante. Se assegniamo un valore al webcontrol da codebehind, tutto funziona correttamente. Ma perché o perché non funziona quando si accede ai valori delle variabili dalla pagina di aspx. –

0

provare a fare il test sia una proprietà piuttosto che un campo:

esempio

public string Testing 
{ 
    get { return "Hello World!"; } 
} 
+0

Non farà la minima differenza. –

+0

scusate ma no, che non cambierà nulla –

+0

Le mie scuse, dopo aver fatto alcuni lavori, si sono rivelate una parte della soluzione. +1 per quello! –

1

Oppure si potrebbe impostare la proprietà Text del letterale nel codice dietro:

ltrTesting.Text = "Hello World!"; 
+0

true, ma non voglio accedervi da code-behind come quello :) –

Problemi correlati