2012-01-16 10 views
5

Obtuve un control de usuario web donde tengo controles que deben alimentarse con algunos datos de variables o propiedades de la página subyacente.Obtiene el valor variable del código y lo usa en el control de página 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 
     } 
    } 
} 

He leído este tema, pero no lo puedo resolver mi problema, supongo que es porque se trata de un control de usuario y no una página. I want to get property value from code behind

+0

¿Por qué no establecer en su lugar el valor de los controles del código? – Magnus

+0

@Magnus Debido a la portabilidad de los controles, eso es, por supuesto, una opción, pero es la última opción de –

+0

ok ... portabilidad, ¿cómo? – Magnus

Respuesta

12

Resuelto esto, la solución por debajo

Desde que utiliza un control de usuario Web en este caso la habitual los escenarios no funcionarían Pero poniendo un databind en la página que controla el control de usuario, o cualquier materpage en la cadena por encima del control de usuario web el código comenzó a trabajar

MasterPage CodeBehind 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(); 
    } 
} 

, todas las soluciones sugeridas a continuación funciona

<%@ 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 de 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) 
     { } 
    } 
} 

¡Gracias por la inspiración!

6

Normalmente no puede colocar scriplets en los controles del servidor. Pero hay una solución fácil: utilizar un control HTML plano:

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

Esa es una solución simple, pero si me permiten utilizar controles un poco más avanzados como un control web personalizado que solo representa si el valor asignado no es nulo, no lo hará –

+1

¿Un control web que solo representa si se le asigna un determinado valor? Eso es todo un conjunto separado de problemas –

+0

Adam, ese ya está cubierto y funcionando. Si asignamos un valor al control web desde el código subyacente todo funciona bien. Pero ¿por qué? ¿Por qué no funciona cuando se accede a los valores variables desde la página aspx? –

0

intentar hacer las pruebas sean una propiedad en lugar de un campo:

por ejemplo,

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

No hará la menor diferencia. –

+0

lo siento pero no, eso no cambiará nada –

+0

Mis excusas, después de hacer algunos trabajos esto resultó ser una parte de la solución. +1 por eso! –

1

O puede establecer la propiedad Text del literal en el código subyacente:

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

cierto, pero no quiero acceder desde código subyacente así :) –

Cuestiones relacionadas