【问题标题】:How to use __doPostBack()如何使用 __doPostBack()
【发布时间】:2011-04-05 05:35:41
【问题描述】:

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

点击按钮之类的简单操作可能会触发__doPostBack() 事件。我只是想了解这个机制是如何工作的。

【问题讨论】:

  • 首先,__doPostBack 不会导致异步操作,除非它被 UpdatePanel 内部的控件触发。
  • 为什么这被标记为c#javascript。我了解javascript 部分,但不了解c# 部分。
  • @Solomon Ucko - 因为 __doPostBack() 导致页面 POST 到其服务器端实现,这很可能是在 C# 中(可能是 VB.NET)
  • 虽然它通常有效,但实际上并不支持手动插入__doPostBack。如果您的页面上没有触发回发的任何内容,asp.net 可能会省略定义__doPostBack 函数。支持的方法是调用ClientScriptManager.GetPostBackEventReference,它以__doPostBack(...) 的形式返回一个字符串,并确保定义了__doPostBack

标签: c# javascript asp.net postback


【解决方案1】:

例如,您可以在 Web 表单中使用名为 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
}

试一试,让我们知道这是否适合您。

【讨论】:

  • 问个简单的问题,__EVENTARGUMENT 是参数还是 btnSave?
  • 是参数。 __EVENTTARGET 会给你按钮。
  • 如果我有两个或更多按钮执行 __doPostBack 那么我如何在 page_load() 的服务器端区分它们。
  • 我有多个参数是什么情况?
  • @Wilson 作为另一个想法,您的论点可能是 Json 数据,可以映射到 C# 中的对象,然后您可以使用 Json.net 反序列化/序列化到对象等。
【解决方案2】:

这也是让服务器端控件回发到 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);

【讨论】:

  • 应该使用 UniqueID,而不是 ClientID。
  • 或者设置MyButtonClientIDMode="Static"属性,这样ASP就不会破坏按钮的ID。
【解决方案3】:

这里有一个brief tutorial__doPostBack() 的工作原理。

说实话,我用的不多;至少直接。许多服务器控件(例如,ButtonLinkButtonImageButtonGridView 的一部分等)使用__doPostBack 作为它们的回发机制。

【讨论】:

  • 快进6年后;如果仍然使用它,我会感到震惊。 Web 开发的方法通常已经远离了使用此类东西的心态。
  • @Phil - 哈哈,我昨天在阅读这个线程时正在查看一个实现它的错误:) 在这个时代它确实看起来很古老
  • 快进了 6 年……而 ASP.NET Web 窗体仍然可以做到这一点。因此,接受的答案获得了压倒性的支持。
  • @kbrimington:我没有说 ASP.NET 不会“仍然这样做”。我不希望它有太大变化。我的意思是,使用 ASP.NET WebForm 进行新开发的人越来越少,而其他人正在迁移它。
【解决方案4】:

我只想为asp:button 在这篇文章中添加一些内容。我已经尝试过 clientId,但它似乎对我不起作用:

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

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

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

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

【讨论】:

  • 是的,我在使用 ClientID 时遇到了问题,因为我使用的是 ClientIDMode = Static。使用UniqueID 有效。
  • 我一直在努力让它工作,但 ClientID 和 UniqueId 都不适合我。
  • 天啊!几天试图解决这个问题。 UniqueID 确实解决了这个问题。谢谢老兄!
【解决方案5】:

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

举个例子:

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

将在服务器上触发:

protected void btn_Click(object sender, EventArgs e)

我没有找到更好的方法来获取参数,所以我仍在使用Request["__EVENTARGUMENT"]

【讨论】:

    【解决方案6】:

    正如其他人所说,您需要将控件的 UniqueID 提供给 __doPostback() 方法。

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

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

    UniqueID之所以起作用,是因为UniqueIDname在服务器控件以HTML呈现时实际上是同一个东西。

    这里有一篇文章描述了什么是 UniqueID:

    UniqueID 属性还用于为 HTML 提供值 输入字段的“名称”属性(复选框、下拉列表和 隐藏字段)。 UniqueID 在回发中也起着重要作用。这 支持回发的服务器控件的 UniqueID 属性, 为 __EVENTTARGET 隐藏字段提供数据。 ASP.NET 运行时 然后使用 __EVENTTARGET 字段查找触发的控件 回发,然后调用它的 RaisePostBackEvent 方法。

    源代码: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid

    【讨论】:

      【解决方案7】:

      我就是这样做的

          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);               
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 2021-02-25
        • 1970-01-01
        • 2013-06-10
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多