【问题标题】:Button click/page submit from JavaScript来自 JavaScript 的按钮点击/页面提交
【发布时间】:2011-08-16 11:16:40
【问题描述】:

我想了解 asp.net 框架如何知道按钮何时被点击,因此一旦它收到请求就会在服务器上触发其点击事件。

我需要了解它是如何工作的,因为我想从 javascript 触发按钮的服务器点击事件。

我可以通过 JavaScript 提交页面:

 document.forms[0].submit();

但是如何做同样的事情,让 asp.net 认为按钮点击已经发生,所以在服务器上,一旦收到请求,它的点击事件就会触发。

谢谢

更新 1

感谢大家的回复。如果我添加一个 asp.net 按钮并通过查看源代码进行一些测试,我似乎无法找到生成的 JavaScript“__doPostBack”函数。

这是我尝试过的测试。

我有一个普通的 HTML 按钮 (button1) 和一个 asp.net 按钮。(button2)

从 HTML 按钮的单击事件 (button1),我添加了一个客户端调用,以传递 asp.net button2 id 的 javascript __doPostback 方法。

所以我试图通过调用 html 按钮 (button1.) 来触发服务器端 button2 点击事件。

<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
        <input id="Button1" type="button" 
         value="Raise Button2 server side click event"
         onclick="javascript:__doPostBack('Button2', '')" /> 

        <asp:Button ID="Button2" runat="server" 
        Text="asp.net_Button2" 
        OnClick="button2Click" />  
    </div>  
    </form>  
</body>  
</html> 

以及生成的 HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
</title>
</head>
<body>
    <form name="form1" method="post" action="Default6.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
value="/wEPDwUKMjA0OTM4MTAwNGRke29WUkB+FLhQArxd1ehT98cWw1Y=" />
</div>

<div>

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" 
value="/wEWAgKLs+3sDgK7q7GGCBs2MBvLk9CJNnA02t08R1LKdiJU" />
</div>
    <div>
        <input id="Button1" type="button" value="Raise Button2 server side click event" 
onclick="javascript:__doPostBack('Button2', '')" />
        <input type="submit" name="Button2" value="asp.net_Button2" id="Button2" />
    </div>
    </form>
</body>
</html>  

更新 2

如果我将按钮的“UseSubmitBehavior”属性设置为 false,那么它会生成 __doPostBack 方法,并通过从客户端调用它会在服务器上引发事件。

那么提交和回发之间有什么区别? (我将为此开始一个新线程)。
感谢您的帮助!

【问题讨论】:

    标签: c# javascript asp.net


    【解决方案1】:

    javascript__doPostBack 函数在页面需要回发时被调用。

    要了解__doPostBack,请阅读this 文章。


    编辑

    使用UseSubmitBehavior 属性来指定Button 控件是使用客户端浏览器的提交机制还是ASP.NET 回发机制。默认情况下,该属性的值为true,导致Button 控件使用浏览器的提交机制。如果您指定 false,则 ASP.NET 页面框架将客户端脚本添加到页面以将表单发布到服务器。

    UseSubmitBehavior属性为false时,控件开发者可以使用GetPostBackEventReference方法为Button返回客户端回发事件。 GetPostBackEventReference 方法返回的字符串包含客户端函数调用的文本,可以插入到客户端事件处理程序中。


    参考:

    http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.usesubmitbehavior.aspx

    http://www.w3schools.com/ASPNET/prop_webcontrol_button_usesubmitbehavior.asp

    【讨论】:

    • 感谢您的回复,我已经更新了我的问题,因为我似乎看不到 __doPostBack javascript 方法。
    • @rauland: 你这里用的是什么浏览器?
    【解决方案2】:

    这是负责执行正确的服务器端方法的代码:

    private void RaisePostBackEvent(NameValueCollection postData)
    {
        if (this._registeredControlThatRequireRaiseEvent != null)
        {
            this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
        }
        else
        {
            string str = postData["__EVENTTARGET"];
            bool flag = !string.IsNullOrEmpty(str);
            if (flag || (this.AutoPostBackControl != null))
            {
                Control control = null;
                if (flag)
                {
                    control = this.FindControl(str);
                }
                if ((control != null) && (control.PostBackEventHandler != null))
                {
                    string eventArgument = postData["__EVENTARGUMENT"];
                    this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument);
                }
            }
            else
            {
                this.Validate();
            }
        }
    }
    

    这取自Page类源代码,.NET 4.0

    正如您所见,正如 SLaks 已经解释的那样,代码正在寻找 ID 等于作为隐藏表单字段传递的 ID 的控件,称为 __EVENTTARGET,然后调用处理程序 PostBackEventHandler(如果存在)。

    【讨论】:

      【解决方案3】:

      这可能会有所帮助: Call ASP.NET function from JavaScript?

      【讨论】:

        【解决方案4】:

        您可以使用客户端代码完美地模拟按钮点击:

        document.getElementById("<%=Button1.ClientID%>").click();
        

        Button1是“服务器端”按钮的ID。

        【讨论】:

        • 谢谢,我猜一旦发生客户端点击,页面就会提交回服务器,但是服务器如何知道它是由于该按钮的点击而被提交的,所以,在服务器上它去触发它的服务器端点击事件。
        • @rauland - 通过单击带有click() 的按钮触发onclick 代码,SLaks 解释得非常好。
        【解决方案5】:

        ASP.Net 将客户端 onclick 处理程序添加到按钮,该处理程序以按钮名称作为参数调用客户端 __doPostback 方法。
        此方法将按钮名称插入隐藏字段并提交表单。
        (您可以在页面源中看到所有这些)

        在服务器上,ASP.Net 从隐藏字段中查找控件和事件名称,并生成适当的服务器端名称。

        【讨论】:

        • 一个个人问题,很抱歉在这里问;我刚刚查看了您的个人资料,这很棒,但我看到了您的年龄,您才 20 岁。是真的吗?
        • 感谢您的回复,我已经更新了我的问题,因为我看不到 __doPostback 方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2016-11-28
        • 1970-01-01
        相关资源
        最近更新 更多