【问题标题】:asp:Button in jQuery dialog box not firing OnClick eventasp:jQuery 对话框中的按钮未触发 OnClick 事件
【发布时间】:2013-05-08 19:09:24
【问题描述】:

我在jQuery 对话框中有一个asp:Button,OnClick 事件没有触发。我正在使用PostBackUrl 属性导航到另一个页面,但我想在OnClick 事件中设置这个属性,以便我可以根据a 的名称附加一个查询字符串变量他们在对话框中上传的文件。我之前发布了一个关于此对话框的问题,因为我根本无法将其发回,但这已得到修复。单击按钮回发很好,我可以在 asp 标记中设置PostBackUrl 属性,或者在后面代码的Page_Load() 中设置。但由于某种原因,我无法触发OnClick 函数,这就是我想要设置PostBackUrl 的地方。这是 .aspx...

<form id="frmDialog" runat="server">
        <asp:Button ID="btnDisplayDialog" runat="server" Text="Click to Display Login Dialog" OnClientClick="showDialog(); return false;" />
        <div class="divInnerForm"></div>
        <div class="divDialog" style="display: none">
            <table style="width: 100%;">
                <tr>
                    <td>First Name: <asp:TextBox ID="txtFirstName" runat="server" Text=""></asp:TextBox></td>
                    <td>Last Name: <asp:TextBox ID="txtLastName" runat="server" Text=""></asp:TextBox></td>
                </tr>
                <tr>
                    <td>
                        How Old are You?
                        <asp:DropDownList ID="ddlAge" runat="server">
                            <asp:ListItem Value="1">1</asp:ListItem>
                            <asp:ListItem Value="2">2</asp:ListItem>
                            <asp:ListItem Value="3">3</asp:ListItem>
                        </asp:DropDownList>
                    </td>
                    <td>
                        How Many Siblings do You Have?
                        <asp:DropDownList ID="ddlNumberSiblings" runat="server">
                            <asp:ListItem Value="1">1</asp:ListItem>
                            <asp:ListItem Value="2">2</asp:ListItem>
                            <asp:ListItem Value="3">3</asp:ListItem>
                            <asp:ListItem Value="4">4</asp:ListItem>
                        </asp:DropDownList>
                    </td>
                </tr>
                <tr>
                    <td>
                        What is your birthday?
                        <input type="text" id="datepicker" name="datepicker" />
                    </td>
                </tr>
                <tr>
                    <td>
                        Please Choose a Picture to Upload:
                        <asp:FileUpload ID="fupUserPicture" runat="server" />
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnUserPicture_Click" />
                    </td>
                </tr>
            </table>
        </div>
    </form>

...显示对话框并将其放置在表单中的 jQuery 脚本...

    function showDialog() {
        $('.divDialog').dialog({
            modal: true, show: 'slide', width: 500,
            open: function (event, ui) {
                $('.divInnerForm').append($(this).parent());
            }
        });
    }

...以及我的 OnClick 函数背后的代码....

 protected void btnUserPicture_Click(object sender, EventArgs e)
        {
            string fileName = "";
            if (fupUserPicture.HasFile)
            {
                try
                {
                    fileName = Path.GetFileName(fupUserPicture.FileName);
                    fupUserPicture.SaveAs(Server.MapPath("~/Images/" + fileName));
                }
                catch (Exception ex)
                {
                }
                btnSubmit.PostBackUrl = "~/Profile.aspx?pic=" + fileName;
            }
        }

编辑:好的,这是对话框中的提交按钮实际呈现为 HTML 的方式。我认为这可能是问题所在。如您所见,javascript onclick 只是提供“Profile.aspx”作为回发网址,尽管在我看来任何服务器端代码都应该首先执行。这是在表格内...

<input id="btnSubmit" type="submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("btnSubmit", "", false, "", "Profile.aspx", false, false))" value="Submit" name="btnSubmit">

..如果我从Page_Load() 函数中删除btnSubmit.PostBackUrl = "~/Profile.aspx",它的呈现方式如下......

<input id="btnSubmit" type="submit" value="Submit" name="btnSubmit">

编辑2:好的,所以我在对话框外添加了另一个隐藏的asp按钮,对话框内的按钮现在调用一个javascript函数,触发隐藏按钮的OnClick事件。同样的事情,javascript函数运行良好,但btnHidden_Click()函数does not run!我完全不知所措,此时我真的不知道为什么这不起作用。这是新的隐藏按钮,在对话框 div 之外,但在表单内部,如您所见....

 </div>
        <asp:Button ID="btnHidden" runat="server" Text="" Visible="false" ClientIDMode="Predictable"  OnClick="btnHidden_Click"/>
    </form>

...这是对话框中带有 OnClientClick 事件的按钮,正如我所说的,它运行良好...

                <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="forcebtnHiddenClick(); return false;" />

这是 btnHidden 后面代码中的 OnClick 函数,虽然它和之前完全一样...

   protected void btnHidden_Click(object sender, EventArgs e)
        {
            string fileName = "";
            if (fupUserPicture.HasFile)
            {
                try
                {
                    fileName = Path.GetFileName(fupUserPicture.FileName);
                    fupUserPicture.SaveAs(Server.MapPath("~/Images/" + fileName));
                }
                catch (Exception ex)
                {
                }
                Response.Redirect("~/Profile.aspx?pic=" + fileName);
            }
        }

...以及 运行的 javascript 函数,但由于某种原因不会导致 btnHidden_​​Click 运行...

function forcebtnHiddenClick(e) {
    //__doPostBack('btnHidden', 'OnClick');
    $('#btnHidden').trigger('click');
}

..如您所见,我尝试了 .trigger('click') 和 __doPostBack(),均无济于事。

编辑:好的,所以问题肯定是

 function forcebtnHiddenClick() {
            __doPostBack('btnHidden', '');
}

函数,它实际上并没有触发btnHidden_Click 事件。当我使btnHidden可见并直接单击它时,btnHidden_Click函数运行正常。

编辑:经过大量搜索,找到了这个并让它工作......

 function forcebtnHiddenClick() {
            <%= ClientScript.GetPostBackEventReference(btnHidden, string.Empty) %>;
        }

不知道为什么

__doPostBack(<%= btnHidden.ClientID %>, '') 

没用。

【问题讨论】:

  • 语句是什么 $('.divInnerForm').append($(this).parent());试图chaeiev?尝试评论它..
  • 我不明白当您说按钮回发正常但 onclick 不触发时。单击事件将生成回发。您是说当页面通过回发时,按钮事件处理程序是当你在它上面设置一个断点时没有被击中?
  • @pranag 没有该脚本 jQuery 在页面呈现时将对话框移到表单之外
  • @Abide 如果我设置属性 PostBackUrl,单击该按钮将返回到我设置的 url。但是,设置 OnClick 事件不会导致事件触发。因此,如果我将 PostBackUrl inside 设置为事件函数,比如 btn_Click,它只会回发到同一页面。但是,如果我在 Page_Load 函数或 asp 标记中设置 PostBackUrl,单击该按钮将返回到预期的页面。所以 OnClick 事件根本不会触发。
  • @Abide 是的,我就是这么说的,对不起。

标签: javascript jquery asp.net post onclick


【解决方案1】:

试试这个

function showDialog() {
    $('.divDialog').dialog({
        modal: true, show: 'slide', width: 500
    });
   $(".divDialog").parent().appendTo($("form:first"));
}

您应该将 divDialog 附加到表单而不是空 divInnerForm。然后您的按钮将在表单中,并且它的点击事件将愉快地触发。

更新

也可以尝试使用 onclient click。然后将此属性连接到一个函数,该函数将强制在隐藏按钮上回帖。

<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClientClick="forceClick();" />
<asp Button id="hidButton" runat="server" onclick="hidButton_Click" />

function forceClick(){

__doPostBack('<%#hidButton.UniqueId %>');
}

然后使用事件处理程序 hidButton_Click 来放置您的代码。

【讨论】:

  • 这会将对话框放入表单中,但这不是问题。检查我在第一个答案中所做的评论。
  • 这会将对话框及其内容放入表单中。然后当我们确定按钮在表单中时,我们可以尝试解决为什么它没有触发。如果您设置了客户端点击在按钮上它会触发。然后我们可以使用该属性和另一个隐藏按钮来强制回发。
  • 是的,我想这就是我最终会尝试的。
【解决方案2】:
$(this).parent().appendTo('form') 

应该可以正常工作。将其附加到表单以触发服务器端事件

【讨论】:

  • 这肯定会将对话框放入表单中,但这不是问题,对话框肯定已经在表单中。我认为问题在于按钮实际呈现为 html 的方式,我现在发布源...
  • 只是标准的 创建 web 表单页面时生成的。
  • 这解决了我在 $.blockUI() 中的问题
【解决方案3】:

当我使用 jQuery 对话框时,我总是使用对话框中的按钮。然后,当它们被点击时,我调用一个 javascript 函数来执行我的操作。

如果我需要处理来自这些按钮的 PostBack,那么我会在页面上创建一个单独的 ASP.Net 按钮 - 这是我用来处理 OnClick 事件的按钮。但是,用户不会单击此 ASP.Net 按钮(我用 css 将其隐藏,因此它在页面上不可见)。相反,当他们单击对话框按钮时我调用的 javascript 函数将调用模仿我的 ASP.Net 按钮单击的代码。

结果是当点击对话框按钮时,页面会像点击 ASP.Net 按钮一样回发,我可以通过我的 OnClick 事件来处理它。

这是一些示例代码(在 VB.Net 中)...

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

当页面被构建时,它将包含 handleSubmitMyButton() javascript 函数。对话框按钮单击将调用此函数,这将触发 PostBack,就像单击“MyButton”按钮一样。

通常我不必用 css 隐藏 ASP.Net 按钮。通常是单击以打开对话框的按钮。我在打开对话框时阻止回发;然后当单击对话框按钮时,我会模仿该按钮的单击。

更新: 看到好几个人提到下面这行代码

$(this).parent().appendTo(jQuery("form:first"));

我认为这就是你试图用你的代码行做的事情:

$('.divInnerForm').append($(this).parent());

但是,如果这不做同样的事情,您将需要有代码来将您的字段添加到表单中。

【讨论】:

    【解决方案4】:

    我使用模态对话框,我需要添加一行,否则我会在关闭按钮上获得模态透明度!

    var $ObjDialog = $("div[id*='div_MyPopup']");
    $ObjDialog.dialog({
        modal: true
    });
    $ObjDialog.parent().prev().appendTo($("form:first"));
    $ObjDialog.parent().appendTo($("form:first"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2020-05-01
      • 2012-01-28
      • 1970-01-01
      相关资源
      最近更新 更多