ASP.NET Лучший способ сохранить значение label.text между обратной передачей с PageMethods - PullRequest
4 голосов
/ 01 апреля 2009

ASP.NET 2.0, PageMethods.

Добрый день,

Я использую ASP.NET AJAX PageMethods для динамического изменения текста метки при изменении выпадающего списка на моей странице.

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

Однако это решение не кажется мне действительно чистым. Есть ли другие альтернативы или лучшие практики?

Спасибо!


Просто чтобы уточнить, у меня есть выпадающий список с именами людей. Когда выпадающий список меняется, я хочу, чтобы на этикетке был телефон этого человека. Однако я подумал, что полная обратная передача - не самая лучшая альтернатива, поэтому я решил получить телефон с PageMethod, передавая Id элемента, выбранного в раскрывающемся списке, для извлечения телефона, и поместить его на этикетку.

Однако, поскольку другие элементы управления вызывают полную обратную передачу, я теряю телефон при каждой обратной передаче. Я знаю, что если поместить его в скрытое поле, а затем установить обратно на метку в Page_Load при полной обратной передаче, это сработает, но мне было интересно, есть ли другое решение. Поскольку WebMethods помечены как статические, я не могу написать Label.text = person.Telephone; в них.

Ответы [ 4 ]

5 голосов
/ 01 апреля 2009

Поскольку у вас, похоже, есть ajax, вы можете просто выполнить частичную обратную передачу, записать число в метку и в представление состояния, а в page_load записать значение из состояния просмотра в метку.

В обработчике событий DropDownList:

string phone = <.. get phone number ...>;
myLabel.Text = phone;
ViewState["currentPhone"] = phone;

А на PageLoad:

myLabel.Text = (ViewState["currentPhone"] != null) ? (string)ViewState["currentPhone"] : string.Empty;

Если вы не хотите использовать Ajax, вы можете определить HiddenInputField в вашем aspx-файле, заполнить содержимое javascript и при обратной передаче заполнить метку содержимым. На aspx:

<asp:HiddenInputField runat="server" ID="myHiddenInput" />

на странице загрузки:

myLabel.Text = myHiddenInput.Value;
1 голос
/ 01 апреля 2009

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

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

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

0 голосов
/ 01 апреля 2009

Рассматривали ли вы просто помещение кода в Page_Load, чтобы убедиться, что метка отражает требуемое значение на основе значения выпадающего списка? Таким образом, при каждой обратной передаче вы, по крайней мере, обязательно получите правильное значение, и вам не придется беспокоиться о том, чтобы хранить его в 2 местах.

0 голосов
/ 01 апреля 2009

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

Если эта логика слишком сложна или вы не хотите поддерживать ее в нескольких местах, то следующий лучший вариант - это то, что вы предложили. Я не уверен, почему вы думаете, что это не чистое решение, это отличный способ передачи информации от клиента к серверу.

...