0

我在未触发事件的jQuery对话框中有一个 asp:Button 。OnClick我正在使用该PostBackUrl属性导航到另一个页面,但我想在事件中设置此属性,OnClick以便我可以根据他们在对话框中上传的文件的名称附加查询字符串变量。我之前发布了一个关于此对话框的问题,因为我根本无法将其发回,但这已得到修复。单击按钮回发很好,我可以PostBackUrl在 asp 标记中设置属性,或者在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">

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

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

编辑2:好的,所以我在对话框之外添加了另一个隐藏的asp按钮,对话框内的按钮现在调用一个触发OnClick隐藏按钮事件的javascript函数。同样的事情,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 %>, '') 

不起作用。

4

4 回答 4

6

试试这个

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

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

更新

也可以尝试使用 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 来放置您的代码。

于 2013-05-08T19:27:10.997 回答
2
$(this).parent().appendTo('form') 

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

于 2013-05-08T19:29:50.603 回答
0

当我使用 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());

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

于 2013-05-08T19:33:07.130 回答
0

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

var $ObjDialog = $("div[id*='div_MyPopup']");
$ObjDialog.dialog({
    modal: true
});
$ObjDialog.parent().prev().appendTo($("form:first"));
$ObjDialog.parent().appendTo($("form:first"));
于 2014-11-05T13:40:08.843 回答