如何在asp.net中使用__doPostBack函数

时间:2013-05-03 15:00:02

标签: c# javascript asp.net postback

我正在尝试使用__doPostBack功能,因此我可以强制我的页面在页面加载上进行后期打包但我理解上有些困难。

当我在线查看示例时。点击按钮,我想回发帖但不知道如何完成后面代码中的代码。

这是我到目前为止所拥有的:

<script type="text/javascript">
        function DoPostBack() {
            __doPostBack('btnNew', 'MyArgument');
        }
    </script>

这是我的按钮

 <asp:Button ID="btnNew" runat="server" CausesValidation="False" CommandName="New" OnClick="DoPostBack()" Text="Create" />

我似乎不明白在后面的代码中使用“MyArgument”。我需要在后面的代码中做什么,所以它会在页面加载上回发?在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

情景1

如果您想使用JavaScript 功能触发回发,则需要将OnClick替换为OnClientClick。像这样修改按钮定义(我已经假设它嵌套在UpdatePanel内):

<asp:Button ID="btnNew" 
    runat="server" 
    CausesValidation="False" 
    CommandName="New" 
    OnClientClick="DoPostBack();" 
    Text="Create" />

在后面的代码中,在Page_Load方法中,阅读Request["__EVENTTARGET"]Request["__EVENTARGUMENT"]

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        if (Request["__EVENTTARGET"] == "btnNew" && 
            Request["__EVENTARGUMENT"] == "MyArgument")
        {
            //do something
        }
    }
}

场景2

如果您不一定要使用JavaScript ,请修改按钮的定义,如下所示:

<asp:Button ID="btnNew"
    runat="server"
    CausesValidation="False"
    CommandName="New"
    OnClick="DoPostback"
    CommandArgument="MyArgument"
    Text="Create" />

然后,在后面的代码中添加以下方法:

protected void DoPostback(object sender, EventArgs e)
{
    var target = ((Button)(sender)).ClientID; //"btnNew"
    var argument = ((Button)(sender)).CommandArgument; //"MyArgument"
    if (target == "btnNew" &&
        argument == "MyArgument")
    {
        //do something
    }
}

答案 1 :(得分:2)

作为参数传递给函数__doPostBack的值将作为名为__EVENTTARGET__EVENTARGUMENT的请求参数发送到服务器。 ASP.NET使用这些值来确定触发事件的控件以及应将哪些参数作为EventArgs对象传递。但您可以使用对象HttpRequest直接访问它们:

string eventTarget = this.Request.Params.Get("__EVENTTARGET");
string eventArgument = this.Request.Params.Get("__EVENTARGUMENT");

答案 2 :(得分:1)

ASP.Net提供了一种构建调用以从javascript执行PostBack的方法。

ClientScriptManager.GetPostBackEventReference方法将构建您需要在javascript中使用的代码,以便从特定控件执行PostBack http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.getpostbackeventreference.aspx

下面是一个例子(在VB.Net中)。在代码隐藏中,我正在创建自己的javascript函数。 ASP.Net代码将在我的函数中插入javascript代码,以执行“MyButton”控件的PostBack。构建页面时,此javascript函数将可用。当javascript代码调用此javascript函数时,它将执行PostBack,它将模仿单击“MyButton”按钮时发生的操作。

Dim csm As ClientScriptManager = Page.ClientScript
Dim sb As New StringBuilder
sb.AppendLine("function handleDoPostBack() {")
sb.AppendLine(csm.GetPostBackEventReference(MyButton, ""))
sb.AppendLine("}")
csm.RegisterClientScriptBlock(Me.Page.GetType, "js_code__create_functions", sb.ToString, True)

希望这就是你要找的东西。

<强>更新

这是一个如何调用在服务器端为您创建的javascript函数的示例。

<input type="button" value="Click Me" onclick="handleDoPostBack();" />

我只是制作了一个普通的HTML按钮(而不是使用ASP.Net按钮),因为我不想让按钮的概念与PostBack混淆。这只是一个HTML按钮,除了您要编程的内容之外什么都不做。由于我已经将javascript函数调用添加到onclick,然后当您按下按钮时,它将执行PostBack。当发生这个PostBack时,它会像点击“MyButton”按钮一样;这将是一个ASP.Net按钮,你在页面的某个地方。由于该按钮是一个ASP.Net按钮,它本身就已经自己做了PostBack,这就是为什么我认为你为什么要以编程方式触发PostBack时会有一些混淆。

您也可以直接在代码中调用javascript函数......

<script>
handleDoPostBack();
</script>

一旦代码遇到它,就会发生这种情况。或者,如果将它放在onload事件中,那么在页面加载完成后会调用它。但就像我在评论中提到的那样,你必须要小心,因为你最终可能会遇到一个无限循环。

通过阅读其他答案中的一些评论,您尝试解决的问题似乎与您正在使用的AJAX面板有关。我不熟悉那些,所以我不确定为什么它不适合你,我不知道是否以编程方式触发PostBack将解决你的问题。

但是,如果您确实需要以编程方式触发PostBack,那么这就是您可以使用的代码。我在不希望页面上有按钮的情况下使用它,但我想要一个动作发生。当我的页面上发生其他事情时,我会运行一些javascript代码,就像点击一个按钮一样 - 我可以在服务器端处理该按钮。在我的ASP.Net页面中,我确实包含了按钮,但后来我使用CSS来隐藏用户看不到按钮。所以用户没有看到按钮,但我的javascript代码可以调用我的javacript函数,它将模仿单击该按钮。

答案 3 :(得分:1)

下面的代码适用于我使用C#进行回发。注意我没有使用n#39; MyArgument n#39;参数并将其留空

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "DoPostBack", "__doPostBack('dummybtnPivotGridupdate', '')", true);

其中

<asp:Button ID="dummybtnPivotGridupdate" runat="server" Style="display: none;" ClientIDMode="Static" />

希望这有帮助!