Как использовать __doPostBack ()


161

Я пытаюсь создать асинхронную обратную передачу в ASP.NET __doPostBack(), но я не знаю, как это сделать. Я хочу использовать ванильный JavaScript.

Что-то простое, например, нажатие кнопки может вызвать __doPostBack()событие. Я просто пытаюсь узнать, как работает механизм.



9
Во-первых, __doPostBack не вызывает асинхронное действие, если оно не запускается элементом управления внутри UpdatePanel.
Ладислав Мрнка

Почему это помечено c # и javascript . Я понимаю часть javascript , но не часть c # .
Соломон Уцко

1
@Solomon Ucko - потому что __doPostBack () заставляет страницу POST к своей реализации на стороне сервера, которая, скорее всего, будет в C # (может быть VB.NET)
sh1rts

1
Хотя это обычно работает, вставка вручную __doPostBackфактически не поддерживается. Если на вашей странице нет ничего, что вызывает обратную передачу, asp.net может опустить определение __doPostBackфункции. Поддерживаемый подход заключается в вызове ClientScriptManager.GetPostBackEventReference, который возвращает строку в форме __doPostBack(...)и гарантирует, что __doPostBackона определена.
Брайан

Ответы:


156

Вы можете попробовать это в своей веб-форме с помощью кнопки с именем btnSave, например:

<input type="button" id="btnSave" onclick="javascript:SaveWithParameter('Hello Michael')" value="click me"/>

<script type="text/javascript">
function SaveWithParameter(parameter)
{
  __doPostBack('btnSave', parameter)
}
</script>

И в вашем коде добавьте что-то вроде этого, чтобы прочитать значение и воздействовать на него:

public void Page_Load(object sender, EventArgs e)
{
  string parameter = Request["__EVENTARGUMENT"]; // parameter
  // Request["__EVENTTARGET"]; // btnSave
}

Попробуйте и дайте нам знать, если это сработало для вас.


1
Просто быстрый вопрос, __EVENTARGUMENT будет параметр или btnSave?
harsimranb

3
Это параметр. __EVENTTARGET даст вам кнопку.
Мистер мистер

Что делать, если у меня есть две или более кнопок, которые делают __doPostBack, то как мне дифференцировать их на стороне сервера в page_load ().
Халид хан

1
В каком случае у меня более одного параметра?
Уилсон

1
@ Уилсон еще раз подумал, что вашим аргументом могут быть данные Json, которые могут отображаться на объект в вашем C #, затем вы можете использовать Json.net для десериализации / сериализации объекта и т. Д.
Mr. Mr.

25

Это также хороший способ заставить серверные элементы управления выполнять обратную передачу внутри FancyBox и / или jQuery Dialog . Например, в FancyBox-div:

   <asp:Button OnClientClick="testMe('param1');" ClientIDMode="Static"  ID="MyButton"  runat="server" Text="Ok" >
</asp:Button>

JavaScript:

function testMe(params) {
    var btnID= '<%=MyButton.ClientID %>';          
    __doPostBack(btnID, params);
}

Page_Load на стороне сервера:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);

4
следует использовать UniqueID, а не ClientID.
Гарр Годфри

Или установите ClientIDMode="Static"атрибут MyButton, чтобы ASP не искажал идентификатор кнопки.
Дэвид Р. Триббл

14

Вот краткий учебник о том, как __doPostBack()работает.

Если честно, я этим мало пользуюсь; по крайней мере, напрямую. Многие серверные элементы управления, (например, Button, LinkButton, ImageButton, части GridViewи т.д.) использование в __doPostBackкачестве своего почтового механизма обратно.


Перенесемся через 6 лет; Я буду в шоке, если все еще использовать это. Подход к веб-разработке в целом отошел от менталитета, в котором используются такие вещи.
Фил

@Phil - ха-ха, я читал эту ветку вчера, когда смотрел на ошибку, в которой это было реализовано :) Это кажется довольно архаичным в
наше время

12
Быстрая пересылка 6 лет ... и ASP.NET Web Forms все еще делает это. Отсюда подавляющее голосование за принятый ответ.
Кбримингтон

@kbrimington: Я не говорил, что ASP.NET не будет «все еще делать это». Я не ожидаю, что это сильно изменится. Я имел в виду, что все меньше людей используют ASP.NET WebForm для новой разработки, а другие переходят с нее.
Фил

10

Я просто хотел бы добавить кое-что в этот пост asp:button. Я попробовал clientId, и он не работает для меня:

__doPostBack('<%= btn.ClientID%>', '');

Однако получение UniqueId, похоже, отправляет обратно на сервер, как показано ниже:

__doPostBack('<%= btn.UniqueID%>', '');

Это может помочь кому-то еще в будущем, следовательно, опубликовать это.


1
Да, у меня были проблемы ClientID, потому что я использовал ClientIDMode = Static. Использование UniqueIDсработало.
Phiter

Я пытался заставить это работать, и ни ClientID, ни UniqueId не работают для меня.
Атамата

О, МОЙ БОГ! Несколько дней пытались решить эту проблему. UniqueID действительно решил проблему. Спасибо приятель!
Faiz Infy

2

Старый вопрос, но я бы хотел кое-что добавить: при вызове doPostBack()вы можете использовать метод действия сервера для действия.

Для примера:

__doPostBack('<%= btn.UniqueID%>', 'my args');

Сработает на сервере:

protected void btn_Click(object sender, EventArgs e)

Я не нашел лучшего способа получить аргумент, поэтому я все еще использую Request["__EVENTARGUMENT"].


0

Как уже говорили другие, вам необходимо предоставить UniqueID элемента управления методу __doPostback ().

__doPostBack('<%= btn.UniqueID %>', '');

На сервере отправленные значения формы идентифицируются атрибутом name полей на странице.

Причина, по которой работает UniqueID, заключается в том, что UniqueID и имя фактически совпадают, когда серверный элемент управления отображается в HTML.

Вот статья, которая описывает, что такое UniqueID:

Свойство UniqueID также используется для предоставления значения атрибуту «имя» HTML полей ввода (флажки, раскрывающиеся списки и скрытые поля). UniqueID также играет важную роль в постбэках. Свойство UniqueID серверного элемента управления, который поддерживает обратные передачи, предоставляет данные для скрытого поля __EVENTTARGET. Затем ASP.NET Runtime использует поле __EVENTTARGET, чтобы найти элемент управления, который вызвал обратную передачу, а затем вызывает его метод RaisePostBackEvent.

источник: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid


0

Вот как я это делаю

    public void B_ODOC_OnClick(Object sender, EventArgs e)
    {
        string script="<script>__doPostBack(\'fileView$ctl01$OTHDOC\',\'{\"EventArgument\":\"OpenModal\",\"EncryptedData\":null}\');</script>";
        Page.ClientScript.RegisterStartupScript(this.GetType(),"JsOtherDocuments",script);               
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.