【问题标题】:Calling server side event in asp.net from java script从javascript调用asp.net中的服务器端事件
【发布时间】:2013-05-23 09:52:57
【问题描述】:

肯定会被标记为重复的,但经过大量的问题和示例后,我无法解决我的问题。
我想要什么?
从客户端 java 脚本调用 asp.net 中的服务器端事件处理程序不会在服务器端进行。我通过设置断点检查它,页面闪烁但未调用服务器端方法。
我在代码后面的点击事件是

  protected void btninsert_Click(object sender, EventArgs e)
  {
      // my code
  }

aspx 文件

   <asp:Button ID="btninsert" runat="server" ValidationGroup="form" CssClass="btn"
      OnClientClick="DoPost()" Text="Save" />

Javascript 方法是

   function DoPost() {
        function DoPost() {
        var chk = document.getElementById('<%= chkstatus.ClientID %>');
        if (chk.checked)
            __doPostBack('<%= btninsert.ClientID %>', 'OnClick');
        return true;
        //return false;
    } 
    } 

我也试过这个 __doPostBack('btninsert', 'OnClick');__doPostBack('btninsert', '');$('btnSubmit').trigger('click'); 没有成功。

我做错了什么?

编辑:如果我使用OnClick 事件,那么无论DoPost 方法中的if condition 是什么,它都会进入服务器端事件。

【问题讨论】:

  • 您在哪里将 btninsert_Click 事件处理程序附加到您的按钮?
  • @Deyneka 我需要附上它吗?怎么样?
  • 您使用 OnClientClick 事件进行客户端附加。将 OnClick 用于服务器事件。 msdn.microsoft.com/en-us/library/…

标签: javascript asp.net postback


【解决方案1】:

啊,这很简单。感谢所有答案。
解决方案
对服务器端事件使用OnClick 属性,对客户端事件使用OnClientclick 进行验证。 OnClientClick javascript 方法将返回 truefalse,这将决定服务器端的 onclick 事件是否会触发。
代码会是这样的

  <script type="text/javascript">
    function DoPost() {
        var chk = document.getElementById('<%= chkstatus.ClientID %>');
        if (chk.checked) {
            var c = confirm("are you sure?");
            if (c == true) {
                return true;
            } else
            { return false; }
        }
        return true;
    } 
</script>

还有按钮标签

<asp:Button ID="btninsert" runat="server" ValidationGroup="form" CssClass="btn"
   OnClientClick="return DoPost();" OnClick="btninsert_Click" Text="Save" />

【讨论】:

  • 是的,__doPostBack 在这种情况下不是必需的,但它仍然适用于您的情况。 __doPostBack 是一个通用的解决方案,假设您想在 DoPost() 中触发另一个事件,如果满足某些条件,您可以调用 __doPostBack(anotherControl,event)。这就是我的回答中建议的内容
  • 问题是您忘记返回 false(在您的问题中)以防止回发当前控件。
  • 是的 @KhanhTo __doPostBack 是通用的,但它没有发回服务器。可能是我错过了 __doPostBack 触发所需的东西。
【解决方案2】:

它可以工作!

如果你调用 __doPostBack('btninsert', ''),将下面添加到 Page_Load

 protected void Page_Load(object sender, EventArgs e)
{
    if ( Request["__EVENTTARGET"] == "btninsert" ) {
        btninsert_Click(sender, e);
    }
}

【讨论】:

  • 内部点击事件发送者被强制转换为Button对象得到CommanArgument。但是,这会引发无法强制转换的异常。我该如何解决这个问题?
  • @ibubi:你也可以调用其他方法而不是事件。如果提供 __doPostBack 的第二个参数,则可以从 Request["__EVENTARGUMENT"] 中获取值。如果您想对列表视图上的对象执行某些操作,这将有所帮助。即从集合中删除一个项目,然后将其绑定到列表视图以在页面上获取更新的列表。
【解决方案3】:
<asp:Button ID="btninsert" runat="server" ValidationGroup="form" CssClass="btn" OnClick="btninsert_Click" OnClientClick="DoPost()" Text="Save" />

添加OnClick="btninsert_Click",因为没有这些信息,asp.net 无法知道要为“Click”事件运行哪个事件处理程序。如果您想控制是否通过客户端脚本回发。你可以这样做:

<asp:Button ID="btninsert" runat="server" ValidationGroup="form" CssClass="btn" OnClick="btninsert_Click" OnClientClick="return DoPost()" Text="Save" />

function DoPost() {
        __doPostBack('<%= btninsert.ClientID %>', 'OnClick');
        return true;
      //return false;
    } 

注意OnClientClick="return DoPost()"

【讨论】:

  • 照你说的做了。它总是在服务器端。我有一个回发条件,就像我编辑的代码一样。这就是为什么我没有定义 Onclick 事件。
  • 在您更新的函数中,您没有返回 false。如果您不想回帖,则必须返回 false
  • @syed mohsin:据我所知,就你而言。选中复选框时可以回发,否则不能回发。您可以尝试将“return true”替换为“return false”。我的代码只是一个例子,你应该根据你的情况返回true或false
【解决方案4】:
<asp:Button ID="btninsert" runat="server" ValidationGroup="form" CssClass="btn"
      OnClientClick="return DoPost();" Text="Save" />

像这样修改你的行

【讨论】:

  • 做到了。没啥事儿。一样
  • 是的。我附加了调试器。
【解决方案5】:

您可以使用 Web 方法尝试 Ajax。我在我的项目中使用了它,它工作正常!您可以在这里看到问题、解决方案和代码:http://www.codeproject.com/Questions/416748/How-to-Call-WebMethod-of-Csharp-from-JQuery

【讨论】:

    【解决方案6】:

    使用 ASP 链接按钮而不是 ASP BUTTON。没有从 javascript 调用按钮控件,因为它的类型是提交,而链接按钮类型是按钮。

    比如我添加了两个asp控件

            <asp:LinkButton ID="lbtest" runat="server" Text="Link Button"></asp:LinkButton>
            <asp:Button runat="server" ID="btnbutton" Text="Button" /> 
    

    并执行页面 当我们查看运行页面的来源时,它看起来像这样

            <a id="lbtest" href="javascript:__doPostBack('lbtest','')">Link Button</a>
            <input type="submit" name="btnbutton" value="Button" id="btnbutton" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      相关资源
      最近更新 更多