скрытое поле имеет значение null для !IsPostBack и не является значением null для IsPostBack

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

У меня есть скрытое поле в моем .aspx

<input type="hidden" name="hid1" value="0" />

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

protected void Page_Load(object sender, EventArgs e) {
    if (!Page.IsPostBack) {

        // This doesn't work!
        Request.Form["hid1"] = "1";

    }

    if (Page.IsPostBack) {

        // This DOES work!
        Request.Form["hid1"] = "1";

    }
}

Проблема в том, что запрос не содержит скрытого поля в массиве формы во время события загрузки страницы, когда это не обратная передача (т.е. - при первом обращении к странице). Последующие обращения к странице (т.е. обратные передачи) приводят к массиву формы, содержащему скрытое поле.

Я уверен, что это связано с жизненным циклом страницы, но мне действительно нужно знать, как установить скрытое поле во время события загрузки страницы и когда это не обратная передача? >

EDIT: я очень, очень не хочу включать атрибут runat="server"!


person Jagd    schedule 24.09.2009    source источник
comment
Боб Кауфман прав; следует отметить, что когда страница не отправляется обратно, данные формы не отправляются вместе с запросом, поэтому Request.Form не заполняется ключом "hid1".   -  person dlamblin    schedule 24.09.2009
comment
Верно, я тоже так предполагал.   -  person Jagd    schedule 24.09.2009


Ответы (5)


Вы можете определить свойство в своем классе страницы, а затем изменить значение свойства в своем коде:

    protected string HiddenFieldValue { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            HiddenFieldValue = "postback";
        else
            HiddenFieldValue = "not postback";
    }

Затем определите скрытое поле формы таким образом, чтобы его значение было равно значению свойства:

    <input type='hidden' id='hidden1' value='<%=HiddenFieldValue %>' />

Если вы хотите установить значение свойства только во время обратной передачи или без нее, вы также можете добавить условие:

    <input type='hidden' id='hidden1' value='<% if(IsPostBack) { %> <%=HiddenFieldValue%> <% } %>' />
person Venr    schedule 24.09.2009
comment
Бам! Это сделало это. Спасибо за нестандартное мышление, Венр. - person Jagd; 24.09.2009

Попробуйте преобразовать ввод в HiddenField контроль (или, по крайней мере, runat="server" input) и ссылайтесь на него по его ID, а не через Request.Form.

person bdukes    schedule 24.09.2009

Вместо:

<input type="hidden" name="hid1" value="0" />

попробуй это:

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

Затем в вашем Page_Load()

hid1.Value = "whatever...";

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

person Bob Kaufman    schedule 24.09.2009
comment
Отрицательно, Хьюстон. Смотрите мой ответ на ответ томлога. Это сработает, но это не то решение, которое мне нужно. runat = искаженный идентификатор - person Jagd; 24.09.2009
comment
я не уверен насчет JQuery, но если вы используете свойство ClientId, вы должны иметь возможность использовать этот идентификатор в своем JQuery. - person Nirlep; 24.09.2009

Почему бы вам не сделать его серверным элементом управления, установив «runat = «сервер»» в элементе управления вводом? Тогда он будет доступен из вашего кода, и вы сможете установить значение во время загрузки первой страницы.

person Tom van Enckevort    schedule 24.09.2009
comment
В двух словах, потому что мне нужно использовать скрытое поле в некоторых функциях JQuery, и я хотел, чтобы идентификатор не искажался из-за runat=server. Если я не могу понять это каким-либо другим способом, я пойду по этому пути, но я был бы очень удивлен, обнаружив, что нет способа получить доступ к скрытому полю с загрузки страницы. хит начальной страницы. - person Jagd; 24.09.2009
comment
@Jagd - это один из моих самых больших страхов перед JQuery + ASP.NET. Используйте идиому, которая смотрит на то, на что заканчивается ваш идентификатор, например: startDatePicker = $(input[id$='TextVisitStartDate']).datepicker(); TextVisitStartDate — это элемент управления TextBox asp.net. - person Bob Kaufman; 24.09.2009
comment
@Bob - Да, обычно я так и делаю (id$='_whatever'), но в этот раз я пытался уйти от этого. Конечно, кажется, что работы много, и я начинаю думать, что это не стоит мучений. - person Jagd; 24.09.2009
comment
Конечно, вы можете установить переменную JavaScript/JQuery с помощью ClientId элемента управления во время загрузки страницы. Таким образом, у вас всегда будет точный идентификатор элемента управления для использования в ваших сценариях. - person Tom van Enckevort; 24.09.2009

почему бы вам не получить доступ к этому полю через класс стиля и не использовать runat server=?

person Pablo Castilla    schedule 24.09.2009
comment
Я не уверен, что вы подразумеваете под доступом к нему через класс стиля. Можете пояснить или привести пример, как это сделать? - person Jagd; 24.09.2009
comment
@Jagd - вы можете добавить произвольный класс в свой скрытый элемент ввода, который вы можете использовать в качестве псевдо-идентификатора, с которым asp.net не будет связываться. Например: <input type="hidden" name="hid1" value="0" class="hid1" />. Затем вы можете получить к нему доступ в jQuery, используя синтаксис селектора класса, не потея над сгенерированными идентификаторами Asp.Net: $(".hid1").function() - person Jeff Sternal; 24.09.2009