如何使用__doPostBack()


161

我正在尝试使用在ASP.NET中创建异步回发__doPostBack(),但是我不知道该怎么做。我想使用香草JavaScript。

诸如单击按钮之类的简单操作可能导致__doPostBack()事件触发。我只是想学习该机制的工作原理。



9
首先__doPostBack不会引起异步操作,除非它是由UpdatePanel中的控件触发的。
Ladislav Mrnka,2010年

为什么使用此标记为c#javascript。我了解javascript部分,但不了解c#部分。
所罗门·乌科2016年

1
@Solomon Ucko-因为__doPostBack()导致页面发布到其服务器端实现,这很可能在C#中(可能是VB.NET)
sh1rts

1
虽然通常可以使用,__doPostBack但实际上不支持手动插入。如果您的页面上没有任何东西会触发回发,则asp.net可能会忽略定义__doPostBack函数。支持的方法是call ClientScriptManager.GetPostBackEventReference,它以格式返回字符串__doPostBack(...)并确保__doPostBack已定义。
布莱恩

Answers:


156

您可以使用名为btnSave的按钮在Web表单中尝试此操作,例如:

<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 2012年

3
它是参数。__EVENTTARGET将为您提供按钮。
先生

如果我有两个或多个执行__doPostBack的按钮怎么办,我该如何在page_load()的服务器端区分它们。
khalid khan 2014年

1
当我有多个参数时会怎样?
威尔逊

1
@Wilson另一个认为您的论点可能是可以映射到C#中对象的Json数据,然后可以使用Json.net对对象进行反序列化/序列化等。– 2014
先生

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。
Garr Godfrey

或设置的ClientIDMode="Static"属性MyButton,以使ASP不会破坏按钮的ID。
David R Tribble

14

这是有关工作原理的简短教程__doPostBack()

老实说,我用的不多;至少直接。许多服务器控件(例如,ButtonLinkButtonImageButton,的部分GridView等)使用__doPostBack他们的回传机制。


快进6年后;如果仍然使用它,我会感到震惊。Web开发的方法通常已经摆脱了使用诸如此类的想法。
菲尔

@Phil-哈哈,我昨天正在看这个线程,同时看到了一个实现了它的错误:)在如今的时代,这看起来确实很陈旧
Terry Delahunt

12
快进了6年...而ASP.NET Web窗体仍然可以做到这一点。因此,绝大多数人接受了公认的答案。
kbrimington

@kbrimington:我不是说ASP.NET不会“仍然这样做”。我不希望它有太大变化。我的意思是,更少的人使用ASP.NET WebForm进行新开发,而其他人正在从中进行迁移。
菲尔(Phil)

10

我只想在此帖子中添加一些内容asp:button。我尝试过clientId,但它似乎对我不起作用:

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

但是,获取UniqueId似乎回发到服务器,如下所示:

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

这可能会在将来对其他人有所帮助,因此将其发布。


1
是的,我遇到麻烦了ClientID,因为我在用ClientIDMode = Static。使用UniqueID有效。
Phiter '16

我一直在尝试使其工作,而ClientID和UniqueId都不适合我。
atamata

我的天啊!几天来试图解决这个问题。UniqueID确实解决了问题。多谢,伙计!
Faiz Infy

2

老问题了,但是我想补充一点:调用时doPostBack(),可以使用服务器处理程序方法进行操作。

例如:

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

将在服务器上触发:

protected void btn_Click(object sender, EventArgs e)

我没有找到一种更好的方法来论证,因此我仍在使用Request["__EVENTARGUMENT"]


0

就像其他人所说的那样,您需要向__doPostback()方法提供控件的UniqueID。

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

在服务器上,提交的表单值由页面中字段的名称属性标识。

之所以可以使用UniqueID,是因为当服务器控件以HTML呈现时,UniqueID名称实际上是同一件事。

这是一篇描述什么是UniqueID的文章:

UniqueID属性还用于为输入字段(复选框,下拉列表和隐藏字段)的HTML“名称”属性提供值。UniqueID在回发中也起主要作用。支持回发的服务器控件的UniqueID属性为__EVENTTARGET隐藏字段提供数据。然后,ASP.NET运行时使用__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);               
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.