2008-10-03 13 views
24

Estoy tratando de establecer atributos para un control IFRAME html desde el archivo aspx.cs de código subyacente.¿Cómo puedo acceder a un IFRAME desde el archivo codebehind en ASP.NET?

me encontré con un post que dice que puedes utilizar FindControl para encontrar los controles no asp usando:

El archivo aspx contiene:

<iframe id="contentPanel1" runat="server" /> 

y luego el código subyacente archivo contiene:

protected void Page_Load(object sender, EventArgs e) 
{ 
    HtmlControl contentPanel1 = (HtmlControl)this.FindControl("contentPanel1"); 
    if (contentPanel1 != null) 
     contentPanel1.Attributes["src"] = "http://www.stackoverflow.com"; 

} 

Excepto que no encuentra el control, contentPanel1 es nulo.


Actualización 1

Mirando el HTML representado:

<iframe id="ctl00_ContentPlaceHolder1_contentPanel1"></iframe> 

he intentado cambiar el código subyacente a:

HtmlControl contentPanel1 = (HtmlControl)this.FindControl("ctl00_ContentPlaceHolder1_contentPanel1"); 

if (contentPanel1 != null) 
    contentPanel1.Attributes["src"] = "http://www.clis.com"; 

Pero no ayudó .

estoy usando una página maestra.


Actualización 2

Cambiar el archivo aspx a:

<iframe id="contentPanel1" name="contentPanel1" runat="server" /> 

Tampoco ayudó


respuesta

La respuesta es obvia e indigna de siquiera hacer la pregunta original. Si tiene el código aspx:

<iframe id="contentPanel1" runat="server" /> 

y desea tener acceso al marco flotante desde el archivo de código subyacente, que acaba de acceder al mismo:

this.contentPanel1.Attributes["src"] = "http://www.stackoverflow.com"; 
+0

¿Estás utilizando páginas maestras? –

+0

Por qué sí, sí, yo soy. –

+0

Mire el HTML procesado (ver fuente) y encuentre el ID representado del iFrame. Usa eso en tu código. Podemos aclararlo más tarde, pero solo intente eso. –

Respuesta

11

Si el iframe es directamente en la página donde se ejecuta el código, debe ser capaz de hacer referencia a él directamente:


contentPanel1.Attribute = value; 

Si no (está en un control secundario, o el MasterPage) , necesitará una buena idea de la jerarquía de la página ... O use el método de fuerza bruta para escribir una versión recursiva de FindControl().

+0

Tienes razón. Simplemente tropecé ciegamente con él cuando busqué el hallazgo recursivo de RyanFetz. this.contentPanel1.Attributes ["src"] = "http://www.stackoverflow.com"; funciona bien! supuse que no funcionaría porque no es un control asp: iframe. Supongo que runat = server lo hace funcionar? –

+1

Sí, usar runat = server lo convierte en un control del lado del servidor de algún tipo. – AaronSieb

0

Trate de crear instancias de contentPanel1 fuera del evento de carga; mantenerlo global para la clase.

+0

¿Alguna sugerencia sobre dónde? –

+0

Aquí hay un poco de vocabulario: la creación de instancias generalmente significa crear la instancia del objeto. Lo que hace allí es simplemente obtener una referencia a un objeto existente (instanciado por código generado) a partir de un método de página. –

1

Trate de usar

this.Master.FindControl ("Content ID"). FindControl ("ID del control")

lugar.

0

El método FindControl busca en los controles secundarios del "control" en el que se ejecuta el método. Intente buscar en la colección de control recursivamente.

protected virtual Control FindControlRecursive(Control root, String id) 
    { 
     if (root.ID == id) { return root; } 
     foreach (Control c in root.Controls) 
     { 
      Control t = FindControlRecursive(c, id); 
      if (t != null) 
      { 
       return t; 
      } 
     } 
     return null; 
    } 
+0

Él sabe dónde está; su solución es un martillo neumático friggen donde un martillo de clavar haría. – Will

0

Pruebe esto.

ContentPlaceHolder cplHolder = (ContentPlaceHolder) this.CurrentMaster.FindControl ("contentMain");

HtmlControl cpanel = (HtmlControl) cplHolder.FindControl ("contentPanel1");

12

Esto funciona para mí.

ASPX:

<iframe id="ContentIframe" runat="server"></iframe> 

que puede acceder directamente a través de la iframe ID.

código subyacente:

ContentIframe.Attributes["src"] = "stackoverflow.com"; 
+0

¡Este es realmente el camino a seguir! –

+0

Y el campo será como este 'protected global :: System.Web.UI.HtmlControls.HtmlGenericControl ContentIframe' ya que no existe un WebControl específico de iframe –

0
<iframe id="yourIframe" clientIDMode="static" runat="server"></iframe> 

Usted debe ellas será capaz de encontrar su iframe utilizando el método FindControl.

configuración clientIDMode a Static impide que se modifique el nombre del objeto durante la representación.

0

Ninguno de sus sugerencias que funcionó para mí, aquí está mi solución:

add src="<%=_frame1%>" //to the iframe id="frame1" html control 
public string _frame1 = "http://www.google.com"; 
1

Dónde está incrustado el iframe?

Tener el código

<body> 

<iframe id="iFrame1" runat="server"></iframe> 

<form id="form1" runat="server"> 

<div> 
     <iframe id="iFrame2" runat="server"></iframe> 
</div> 
</form> 

puedo acceder con iFrame1.Attributes["src"] sólo para iFrame1 y no a iFrame2.

Alternativamente, se puede acceder a cualquier elemento en su formulario con:

FindControl("iFrame2") as System.Web.UI.HtmlControls.HtmlGenericControl 
-1

aspx

<iframe id="fblikes" runat="server"></iframe> 

Código detrás

this.fblikes.Attributes [ "src ="] "/productdetails/fblike.ashx";

Muy simple ....

+0

No lo sé ....... :( –

Cuestiones relacionadas