2008-10-31 30 views
5

¿Cuál es la mejor manera de acceder a un control ASP.NET HiddenField que está incrustado en un control ASP.NET PlaceHolder a través de JavaScript? El atributo Visible se establece en falso en la carga de la página inicial y se puede cambiar a través de una devolución de llamada AJAX.Acceso a un control asp: hiddenfield en JavaScript

Aquí está mi actual código fuente:

<script language="javascript" type="text/javascript"> 
    function AccessMyHiddenField() 
    { 
     var HiddenValue = document.getElementById("<%= MyHiddenField.ClientID %>").value; 

     //do my thing thing..... 
    } 
</script> 
<asp:PlaceHolder ID="MyPlaceHolder" runat="server" Visible="false"> 
    <asp:HiddenField ID="MyHiddenField" runat="server" /> 
</asp:PlaceHolder> 

EDIT: ¿Cómo se configura el estilo de una etiqueta div en el código ascx atrás en C#? Esta es la descripción del código detrás: CssStyleCollection HtmlControl.Style

ACTUALIZACIÓN: He sustituido el asp: HiddenField con un asp: etiqueta y Recibo un "indefinido" cuando puedo mostrar la variable HiddenValue en un cuadro de alerta . ¿Cómo resolvería esto?

ACTUALIZACIÓN 2: Seguí adelante y refactoré el código, reemplacé el control de campo oculto con un control de cuadro de texto y establecí el estilo en "display: none;". También eliminé la función JavaScript (fue utilizada por un control CustomValidator) y la reemplacé con un control RequiredFieldValidator.

+0

Bueno, se puede establecer utilizando la propiedad Atributos, pero ¿por qué necesita para hacerlo del lado del servidor? – Salamander2007

+0

Lo estoy configurando en el lado del servidor porque el campo oculto se muestra cuando el usuario selecciona un elemento de un conjunto de resultados de búsqueda. –

+0

El campo oculto, por definición, está oculto. Si necesita mostrar el valor del campo oculto, use otros controles como TextBox o Label – Salamander2007

Respuesta

5

Según tengo entendido, si configura los controles. Visible = falso durante la carga de la página inicial, no se procesa en la respuesta del cliente. Mi sugerencia para resolver su problema es

  1. No utilice marcador de posición, a juzgar por el escenario, no se necesita realmente un marcador de posición, a menos que necesite para agregar dinámicamente controles en el lado del servidor. Use div, sin runat = servidor. Siempre puedes controlar la visibilidad de ese div usando css.
  2. Si necesita agregar controles dinámicamente más tarde, use marcador de posición, pero no configure visible = falso. El marcador de posición no tendrá ninguna pantalla de todos modos. Establezca la visibilidad de ese marcador de posición mediante css. He aquí cómo hacerlo de forma programática:

    placeholderId.Attributes ["style"] = "display: none";

De todos modos, como otros han dicho, sus problemas ocurre porque una vez que se establece control.visible = falso, que no consigue representa en la respuesta del cliente.

+0

¿Qué valor usaría para eliminar la pantalla ?: ninguno; estilo del marcador de posición? –

+0

placeholderId.Atributos ["style"] = "display: block"; ? o simplemente "mostrar:" funcionaría. – goldenratio

3

Si la Visibilidad se establece en el lado del servidor falso, el marcador de posición no se representará y no podrá acceder a nada dentro de él desde JavaScript. Su código debería funcionar cuando el marcador de posición es visible = "verdadero"

Deshágase del marcador de posición, deje el campo oculto vacío al principio, después de que la búsqueda lo rellene.

1

Si la visibilidad del marcador de posición se configura como falsa, nunca se representará, y el valor del campo oculto solo se almacenará en el ViewState de la página.

solo una pregunta, ¿por qué está estableciendo la visibilidad del marcador de posición como falso, si contiene un campo oculto?

De todos modos, una manera posible de superar este problema es agregar un objeto TextBox o Label, y establecer el estilo CSS de la pantalla en "ninguno", luego en su código copiar lo que está poniendo en el campo oculto en el textbox/lable text property, de esta manera usted puede leer fácilmente el valor usando javascript, ya que el textbox/label será renderizado pero no visible para otros, aunque esto podría no ser tan seguro de hacer.

+0

esto es un fragmento de código que se pone del control de usuario de búsqueda. Cuando el usuario selecciona el elemento de los resultados de búsqueda, representa los marcadores de posición y establece el campo oculto para el valor seleccionado. –

0

Visible no lo hace visible, puede dejarlo predeterminado. Simplemente runat = "server" y use su .Value.

1

En lugar de hacer ".visible = false", cambie el estilo a "mostrar: ninguno;". Eso controlará pero lo hará invisible.

+0

tampoco lo necesita, es un campo oculto, no se muestra nada –

+0

Bueno, en lugar de decir "Lo siento, no se puede hacer", estoy tratando de darle una solución. ¿Por qué no lo intentas en lugar de rechazarlo? – BoltBait

+0

Realmente podría cambiarlo a otro control. Solo pensé en un campo oculto en mi implementación inicial. –

2

Prueba esto:

function popup(lid) 
{ 
    var linkid=lid.id.toString();  
    var lengthid=linkid.length-25;  
    var idh=linkid.substring(0,parseInt(lengthid)); 
    var hid=idh+"hiddenfield1"; 

    var gv = document.getElementById("<%=GridViewComplaints.ClientID %>"); 
    var gvRowCount = gv.rows.length; 
    var rwIndex = 1; 
    var username=gv.rows[rwIndex].cells[1].childNodes[1].innerHTML; 
    var prdid=gv.rows[rwIndex].cells[3].childNodes[1].innerHTML; 
    var msg=document.getElementById(hid.toString()).value; 
    alert(msg); 


    document.getElementById('<%= Labelcmpnme.ClientID %>').innerHTML=username; 
    document.getElementById('<%= Labelprdid.ClientID %>').innerHTML=prdid; 
    document.getElementById('<%= TextBoxviewmessage.ClientID %>').value=msg; 
    return false; 
} 


<ItemTemplate> 
    <asp:LinkButton ID="LabelComplaintdisplayitem" runat ="server" Text='<%#Eval("ComplaintDisp").ToString().Length>5?Eval("ComplaintDisp").ToString().Substring(0,5)+"....":Eval("ComplaintDisp") %>' CommandName ="viewmessage" CommandArgument ='<%#Eval("username")+";"+Eval("productId")+";"+Eval("ComplaintDisp") %>' class='basic' OnClientClick =" return popup(this)"></asp:LinkButton> 
    <asp:HiddenField ID="hiddenfield1" runat ="server" Value='<%#Eval("ComplaintDisp")%>'/> 
</ItemTemplate> 
Cuestiones relacionadas