2010-01-08 6 views
30

Почему я не могу получить значение этого скрытого поля?JQuery Hidden Field

У меня есть контроль над ...

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

Что делает, как ...

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

Что я пытаюсь получить значение, используя ...

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

Итак, что случилось?

Я предпочитаю этот

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

ответ

57

Поскольку JQuery ничего не знает о asp:HiddenField. Он выглядит в структуре HTML, где у вас есть <input type="hidden" name="ctl00$cph_main$HiddenFieldServerDateTime" id="ctl00_cph_main_HiddenFieldServerDateTime" .... Таким образом, нет ввода с ID= HiddenFieldServerDateTime. Есть несколько способов, чтобы преодолеть это:

  • Используйте селектор CSS:

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

    со следующим селектором: var serverDateTime = $(".SomeStyle").val();

    CssClass не доступный класс по HiddenField класса (и у него нет коллекции Attributes, поэтому вы не можете добавить ее вручную).

  • Использование ClientID свойство:

    var serverDateTime = $("#<%= HiddenFieldServerDateTime.ClientID %>").val(); 
    
  • Wrap скрытое поле в чем-то вы можете выбрать:

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

     

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

Thankyou! Это имеет смысл – Dooie

+1

@Darin Немного поздно для вечеринки, но я отправил ответ, который добавляет свойство 'CssClass' в' HiddenField'. Это сделает ваш перечеркнутый раздел действительным. – Rozwel

+0

Я не думал об обертывании его в другом элементе. Хорошая идея. –

1

Добавить гр деваха атрибут «.myHiddenValue» в теге использовать

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

или поскольку это сделает после загрузки документа мой посоветуете использовать этот

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

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

thankyou! Ваш ответ и Дарин Димитров действительно помогли – Dooie

4

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

7

Это будет работать, а также с помощью jQuery, чтобы выбрать все ID, которые заканчиваются на _ HiddenFieldServerDateTime.

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

Я просто побежал в аналогичный вопрос и мой ответ был сделать новый элемент управления, который наследуется от HiddenField и дает ему CssClass свойство:

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); 
    } 
} 

теперь я могу присвоить класс мои скрытые поля и используйте значение класса, чтобы найти правильное поле на стороне клиента.

Возможно также стоит отметить, что в моем случае скрытые поля создаются динамически в коде позади, вышеизложенное может потребоваться некоторые улучшения, которые могут использоваться в дизайнере.

Надеюсь, это поможет кому-то еще на этом пути.

+0

Блестящий! Это спасло мою задницу! –

20

Я знаю, что на это уже был дан ответ и разрешен, но вот два лучше (на мой взгляд) и более простые альтернативы. Если вы используете .NET4 (или выше), вы можете использовать ClientIDMode = «Static», чтобы заставить свой идентификатор для использования в создаваемом HTML:

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

, что означает, что вы можете сделать это в JQuery:

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

или если вы хотите использовать маршрут класса CSS затем использовать обычный ASP: TextBox (который имеет атрибут CssClass), но только не показывать его:

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

, который позволяет это сделать:

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

Обратите внимание, что класс css, который вы используете, не должен быть фактически объявлен нигде. Вы можете просто использовать его в качестве маркера.

+0

Мне нравится вариант с текстовым полем. ClientIDMode = Static кажется для меня рискованным, но потом я трачу много времени на создание элементов управления, которым нужно играть хорошо, когда их несколько. – Rozwel

+0

ClientIDMode отлично работает для одного элемента управления, но не так хорошо в ретрансляторе, так как все они получат одинаковый идентификатор. – bperniciaro