如何在datalist中调用按钮的asp回发?

时间:2014-10-28 20:06:21

标签: javascript c# asp.net

如何进入asp按钮的javascript回发事件调用?

    <ItemTemplate>
        <asp:Button id="btnTest" runat="server" 
                    Text="button" OnClientClick="
            customAsyncConfirmDialog(function (isconfirmed)
            {
                if(isconfirmed)
                {
                    //call this buttons postback event
                    <%# Page.ClientScript.GetPostBackEventReference(new PostBackOptions(Container.FindControl("btnTest")))%>;
                }
            });return false;
            "/>
    </ItemTemplate>
</asp:DataList>

更新:customAsyncConfirmDialog是一个异步函数,不会阻止javascript等待响应。

2 个答案:

答案 0 :(得分:1)

无需这样做。只返回true并返回回发处理程序。例如:

<ItemTemplate>
    <asp:Button id="btnTest" runat="server" 
                Text="button" OnClientClick="
        customConfirmDialog(function (isconfirmed)
        {
            return isconfirmed;                
        });
        "/>
</ItemTemplate>

我无法访问我之前写的内容,但这里有一个基于您在其他答案中所写内容的快速示例。您可能需要更改一些内容,但您应该明白这一点:

window.confirm = function(question, ok, cancel) {
    var defer = $.Deferred();
    ok = ok || 'OK'; //setup text for the confirmation
    cancel = cancel || 'Cancel';

    $(document).ready(function() {

        $('#customMessage').text(question);
         var btnOk = $('#btnCustomOK');
         var btnCancel = $('#btnCustomCancel');
         btnOk.val(ok);
         btnCancel.val(cancel);

        btnOk.unbind("click"); //prevents chaining of events if multiple confirms are used
        btnCancel.unbind("click"); 
        btnOk.click(function() {
            $('#MyConfirm').hide();
            defer.resolve(true); //gets passed as isconfirmed=true
            return false; //prevent postback
        });

        btnCancel.click(function() {
            $('#MyConfirm').hide();
            defer.resolve(false);
            return false; //prevents postback
        });        

        $('#MyConfirm').show();                
        btnOk.focus();
    });
    return defer.promise();
}

然后使用:

<asp:Button id="btnTest" runat="server" Text="button"
  OnClientClick="confirm('My Message blah blah').then(//this runs after ok/cancel is clicked, thanks to defer.resolve() and defer.promise().
function(isConfirmed) {
 if (isConfirmed)
 __doPostBack(source.id,'');
}); return false;//return false here to prevent the initial postback from occurring"/>
    </ItemTemplate>

&quot; source.id&#39;部分并不完全正确,但承诺部分应该帮助你。

答案 1 :(得分:0)

我能够通过以下方式调用回发:

<script type="text/javascript">
    function customConfirmDialog(sourceButton, callback) {
        setTimeout(function () { callback(sourceButton, true); }, 1);
        return false;
    }
</script>

<asp:DataList ID="dlTest" runat="server">
    <ItemTemplate>
        <%# Page.ClientScript.GetPostBackEventReference(new PostBackOptions(Container.FindControl("btnTest")))%>;
        <asp:LinkButton runat="server" ID="neededfor__dopostbackgenerationforsomereason"></asp:LinkButton>
        <asp:Button id="btnTest" runat="server" 
                    Text="button"
            OnClick="btnTest_OnClick"
                    OnClientClick="
                return customConfirmDialog(this,function (sourceButton, isconfirmed)
                {
                    if(isconfirmed)
                    {
                        //call this button's postback event
                        __doPostBack(sourceButton.name,'');
                    }
                }); 
            "/>
    </ItemTemplate>
</asp:DataList>

我必须添加一个链接按钮来生成__doPostBack,不知道为什么单独的ASP:按钮没有触发它。我仍然无法使用Page.ClientScript.GetPostBackEventReference函数中的onClientClick

最后请注意,您需要使用__doPostBack调用sourceButton.name而不是sourceButton.id来触发正确的服务器端事件。