Як користуватися __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
@Wilson , як інші думав , ваш аргумент може бути дані JSON , які можуть відображають до об'єкта в вашому C #, ви могли б використовувати Json.NET для deserialise / сериализации об'єкта і т.д.
Г - н г - н

25

Це також хороший спосіб отримати управління на стороні сервера для відтворення назад у FancyBox та / або діалозі jQuery . Наприклад, у 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 не маніпулював ідентифікатор кнопки.
David R Tribble

14

Ось короткий посібник про те, як __doPostBack()працює.

Якщо чесно, я не дуже використовую це; принаймні безпосередньо. Багато серверні елементи управління, (наприклад, Button, LinkButton, ImageButton, частини GridViewі т.д.) використання в __doPostBackякості свого поштового механізму назад.


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

@Phil - ха-ха, я читав цю тему вчора, дивлячись на помилку, де це було реалізовано :) Це здається досить архаїчним в цей день та вік
Террі Делахунт,

12
Швидкий перехід вперед 6 років ... і ASP.NET Web Forms все ще робить це. Звідси переважне схвалення прийнятої відповіді.
kbrimington

@kbrimington: Я не сказав, що ASP.NET не "все ще зробить це". Я не очікую, що це сильно зміниться. Я мав на увазі те, що менше людей використовують ASP.NET WebForm для нової розробки, а інші мігрують з неї.
Філ

10

Я просто хотів би щось додати до цієї публікації asp:button. Я спробував clientId, і, здається, це не працює для мене:

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

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

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

Це може допомогти комусь іншому в майбутньому, отже, опублікуйте це.


1
Так, я мав проблеми ClientID, тому що використовував ClientIDMode = Static. Використання UniqueIDпрацював.
Фітер

Я намагався змусити це працювати, і ні ClientID, ні UniqueId не працюють для мене.
atamata

О БОЖЕ МІЙ! Кілька днів намагаються вирішити цю проблему. 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 %>', '');

На сервері, представлені значення форми позначається ім'я атрибут порожнистої сторінки.

Причина, по якій працює UniqueID, полягає в тому, що UniqueID та ім'я насправді одне і те ж, коли керування сервером надається в HTML.

Ось стаття, яка описує, що таке UniqueID:

Властивість UniqueID також використовується для надання значення атрибуту HTML "ім'я" полів введення (прапорці, спадні списки та приховані поля). UniqueID також відіграє головну роль у поштових розсилках. Властивість UniqueID серверного управління, яка підтримує поштові розсилки, надає дані для прихованого поля __EVENTTARGET. Потім ASP.NET Runtime використовує поле __EVENTTARGET, щоб знайти керування, яке викликало поштовий відкат, а потім викликає його метод RaisePostBackEvent.

src: 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.