在ASP.NET中,将LinkButton设置为ASP:Panel的默认按钮

3

可能是重复的问题:
页面上的链接按钮并将其设置为默认按钮,在IE中运行良好但在Mozila中不起作用

如何在asp.net中将linkbutton设置为asp:panel的默认按钮?我知道可以将按钮设置为默认按钮,但我的应用程序对所有表单都使用linkbuttons。有什么建议吗?

编辑:

现在我尝试了这个方法,它在Firefox中也有效,但是我的JavaScript验证(ie)在我的linkbutton的onclient click上不起作用,为什么?

var __defaultFired = false;

        function WebForm_FireDefaultButton(event, target) {
            var element = event.target || event.srcElement;

            if (!__defaultFired && event.keyCode == 13 && !(element && (element.tagName.toLowerCase() == "textarea"))) {
                var defaultButton;

                if (__nonMSDOMBrowser)
                    defaultButton = document.getElementById(target);
                else
                    defaultButton = document.all[target];

                if (defaultButton) {
                    if (typeof (defaultButton.click) != "undefined")
                        defaultButton.click();
                    else
                        eval(unescape(defaultButton.href.replace("javascript:", "")));

                    event.cancelBubble = true;

                    if (event.stopPropagation) event.stopPropagation();
                    return false;
                }
            }
            return true;
        }

第二次编辑:

我成功地让我的自定义链接按钮控件工作了,但无法将OnClientClick与其连接。来源:using-panel-defaultbutton-property-with-linkbutton-control-in-asp-net

我做了这个:

<%@ Register Namespace="App_Code" TagPrefix="ac" %>
<asp:Label runat="server" ID="lblHello" />
<asp:Panel runat="server" DefaultButton="lbHello">
    First name: <asp:TextBox runat="server" ID="txtFirstName" />
    <ac:LinkButtonDefault ID="lbHello" runat="server" Text="Click me" 
        OnClientClick="javascript:alert('hai');" OnClick="lbHello_Click" />
</asp:Panel>

我的客户端函数无法正常工作,为什么?有什么建议吗?
4个回答

9
与使用自定义控件不同,您可以采用简单的方法,向文本框添加一个属性来处理onKeyPress事件。这样可以正确处理从文本框按下Enter并触发LinkButton事件的情况。这种方法的缺点是,在Firefox中不会触发任何LinkButton OnClientClick事件,这与您链接到的博客文章中描述的问题有关。只有当用户实际用鼠标点击链接时,才会触发该事件。但是,在IE中,无论是从文本框还是直接点击都会触发事件。

解决方案#1 - 添加属性的代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    txtFirstName.Attributes.Add("onKeyPress",
        "javascript:if (event.keyCode == 13) __doPostBack('" + lbHello.ClientID + "','')");
}

尝试一下,看看是否符合您的需求。只要记住我之前描述的限制即可。
现在,如果您想要消除上述限制,该博客文章的其中一条评论提供了一个似乎可以正确工作的方法。我已经对其进行了修改,以去除 StringBuilder 并转换为 C#。 解决方案 #2 - 添加函数并注册代码如下:
protected void Page_PreRender(object sender, EventArgs e)
{
    string addClickFunctionScript = @"function addClickFunction(id) {
           var b = document.getElementById(id);
           if (b && typeof(b.click) == 'undefined')
             b.click = function() {
               var result = true;
               if (b.onclick) result = b.onclick();
               if (typeof(result) == 'undefined' || result)
                 eval(b.getAttribute('href'));
             }
         };";

    string clickScript = String.Format("addClickFunction('{0}');", lbHello.ClientID);

    Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
    Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + lbHello.ClientID, clickScript, true);
}

页面标记 - 无论是哪种解决方案,页面标记都是相同的:

<asp:Label runat="server" ID="lblHello" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="lbHello">
    First name:
    <asp:TextBox runat="server" ID="txtFirstName" />
    <asp:LinkButton ID="lbHello" runat="server" Text="Click me" OnClick="lbHello_Click"                 
         OnClientClick="javascript:alert('Hello, World!');"/>
</asp:Panel>

在这两种情况下,不需要自定义控件来实现此类型的功能。保持简单。

我已经授予了你。另一个疑问是如何使它可重用于所有具有不同 LinkButton 的 aspx 页面中... - ACP
请帮我解决这个问题:http://stackoverflow.com/questions/3642269/reusable-page-prerender-function-in-asp-net - ACP
@Pandiya,我已经回复了你的新问题。由于需要深入的帖子,所以回复有些晚了。希望这能指引你朝着正确的方向前进。 - Ahmad Mageed

2

我尝试了相同的操作,但在火狐浏览器中无法工作。 - ACP
有没有任何建议可以让它在Firefox上运行? - ACP
抱歉,不行。看起来那篇帖子回答了关于Firefox的问题,但也许后来的FF版本又破坏了代码……不确定。 - Chase Florell

1

另一种方法是通过模拟点击事件来实现。

jQuery(document).ready(function () {
    jQuery('#<%= txtFirstName.ClientID %>').keypress(function (event) {
        if (event.keyCode == 13) {
            eval($('#<%=lbHello.ClientID %>').attr('href'));
        }
    });
});

缺点是您需要在所有需要设置默认按钮的地方使用它。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接