2010-01-08 19 views
30

¿Por qué no puedo obtener el valor de este campo oculto?Jquery Hidden Field

tengo un control ...

<asp:HiddenField ID="HiddenFieldServerDateTime" runat="server" /> 

que hace tan ...

<input type="hidden" name="ctl00$cph_main$HiddenFieldServerDateTime" id="ctl00_cph_main_HiddenFieldServerDateTime" value="08/01/2010 10:54:11" 

¿Qué estoy tratando de obtener el valor de usar ...

var serverDateTime = $("#HiddenFieldServerDateTime").attr('value'); 

¿Qué pasa?

Yo prefiero esta

var dateTime = $("[id$=_HiddenFieldServerDateTime]").val(); 

Respuesta

57

Debido a que jQuery no sabe nada sobre asp:HiddenField. Se ve en la estructura HTML donde tiene <input type="hidden" name="ctl00$cph_main$HiddenFieldServerDateTime" id="ctl00_cph_main_HiddenFieldServerDateTime" .... Entonces no hay entrada con ID= HiddenFieldServerDateTime. Hay algunas maneras de superar esto:

  • Utilice un selector CSS:

    <asp:HiddenField ID="HiddenFieldServerDateTime" 
           runat="server" 
           CssClass="SomeStyle" /> 
    

    con el siguiente selector: var serverDateTime = $(".SomeStyle").val();

    CssClass no es una clase disponible en la clase HiddenField (y no tiene una colección Attributes, por lo que no puede agregarla manualmente).

  • Uso ClientID propiedad:

    var serverDateTime = $("#<%= HiddenFieldServerDateTime.ClientID %>").val(); 
    
  • Envolver el campo oculto en algo que se puede seleccionar:

    <div class="date-time-wrap"> 
        <asp:HiddenField ID="..." runat="server" /> 
    </div> 
    

     

    var serverDateTime = $('.date-time-wrap input[type=hidden]').val(); 
    
+0

¡Gracias! Eso tiene sentido completo – Dooie

+1

@Darin Un poco tarde para la fiesta pero publiqué una respuesta que agrega una propiedad 'CssClass' a' HiddenField'. Hacer esto hace que su sección tachada sea válida. – Rozwel

+0

No pensé en envolverlo en otro elemento. Buena idea. –

1

Añadir un c lass atributo ".myHiddenValue" a la etiqueta a continuación, utilizar

var myVal = $(".myHiddenValue").val() 

o ya que este hará que después de cargar el documento que mi consejo uso de este

$(document).ready(function(){ 
    var myVal = $("input[name='ctl00$cph_main$HiddenFieldServerDateTime']").val(); 
} 
); 

Note: also applies for the first example as well 
+0

gracias! Su respuesta y Darin Dimitrov realmente ayudaron – Dooie

4

<input type="hidden" ID="HiddenFieldServerDateTime" runat="server" class="HiddenFieldServerDateTime" />

7

Esto funciona tanto con la utilización jQuery para seleccionar todos los ID que terminen con _ HiddenFieldServerDateTime.

var myVal = $("[id$='_HiddenFieldServerDateTime']").val(); 
10

Me acabo de encontrar con un problema similar y mi respuesta fue hacer un nuevo control que hereda de HiddenField y le da un CssClass propiedad:

public class HiddenFieldWithClass : HiddenField 
{ 
    [CssClassProperty] 
    [DefaultValue("")] 
    public virtual string CssClass 
    { 
     get 
     { 
      string Value = this.ViewState["CssClass"] as string; 
      if (Value == null) 
       Value = ""; 
      return Value; 
     } 
     set 
     { 
      this.ViewState["CssClass"] = value; 
     } 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (this.CssClass != "") 
     { 
      writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass); 
     } 
     base.Render(writer); 
    } 
} 

ahora soy capaz de asignar una clase a mis campos ocultos y use el valor de clase para encontrar el campo correcto en el lado del cliente.

También vale la pena señalar que en mi caso los campos ocultos se crean dinámicamente en código subyacente, lo anterior puede necesitar algunas mejoras para ser utilizables en el diseñador.

Espero que esto ayude a alguien más en el camino.

+0

Brillante! ¡Esto me salvó el trasero! –

20

Sé que esto ya ha sido respondido y resuelto, pero aquí hay dos alternativas mejores (en mi opinión) y más simples. Si está utilizando .NET4 (o superior) se puede utilizar ClientIDMode = "estático" para forzar su identificación para ser utilizado en el HTML generado:

<asp:HiddenField ID="HiddenFieldServerDateTime" runat="server" ClientIDMode="Static" /> 

que significa que puede hacer esto en su JQuery:

var serverDateTime = $('#HiddenFieldServerDateTime').val(); 

o si desea utilizar la ruta de clase CSS a continuación, utilizar una normal de ASP: Cuadro de texto (que tiene un atributo CssClass), pero simplemente no lo mostrará:

<asp:TextBox ID="HiddenFieldServerDateTime" runat="server" style="display:none" CssClass="MyStyle"></asp:TextBox> 

que le permite hacer esto:

var serverDateTime = $('.MyStyle').val(); 

Tenga en cuenta que la clase de CSS que utiliza no tiene que declararse realmente en ninguna parte. Puedes usarlo como marcador.

+0

Me gusta la opción de cuadro de texto. El ClientIDMode = Static me parece arriesgado, pero luego dedico mucho tiempo a la creación de controles que deben jugar bien cuando hay varias instancias de ellos. – Rozwel

+0

ClientIDMode funciona muy bien para un único control, pero no tan bien en un repetidor, ya que todos obtendrán la misma ID. – bperniciaro