代码之家  ›  专栏  ›  技术社区  ›  Sam Stokes

ASP.NET和Firefox:为什么不单击GridView按钮字段做任何事情?

  •  1
  • Sam Stokes  · 技术社区  · 17 年前

    我有一个非常简单的ASP.NET Web窗体,它看起来有点像以下所示:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="example.aspx.cs" Inherits="example" %>
    
    <form runat="server">
        <asp:GridView runat="server" id="grid" AutoGenerateColumns="false" OnRowCommand="DoStuff">
            <Columns>
                <asp:ButtonField Text="Do stuff" />
            </Columns>
        </asp:GridView>
    </form>
    

    (在pageload中我调用 grid.DataBind() 和事件处理程序 DoStuff 无标记。)

    当我在Internet Explorer中查看它并单击ButtonField(呈现为链接)时,事件处理程序将按预期激发。当我在火狐中点击它时,什么都不会发生。

    如果我打开Firebug的javascript调试控制台,然后单击链接,它会在javascript中显示一个错误。 onclick 由ASP.NET自动生成的处理程序:

    theForm is undefined
    __doPostBack("grid", "$0")
    javascript:__doPostBack('grid', '$0')()
      if (!theForm.onsubmit || (theForm.onsubmit() != false)) {\r\n
    

    为什么会发生这种情况?我如何使buttonfield在Firefox中工作?

    (注意,我在问这个问题 in order to answer it myself :我已经发现了我为什么会看到上面的错误,为了自己和他人的利益,我想把它记录下来。如果您知道其他使用ASP.NET和Firefox的gotchas,请随意添加其他答案。)

    1 回复  |  直到 16 年前
        1
  •  1
  •   user2013    17 年前

    这是由于浏览器在存在无效HTML的情况下处理JavaScript的方式不同:特别是当表单没有被包围时 <html> 和 <body> 标签。如果没有这些标签,火狐似乎试图初始化变量 theForm 在窗体实际存在之前。

    添加适当的 <HTML> 和 <车身> 表单周围的标签(在任何情况下都是有效HTML所必需的)使点击处理程序在IE和Firefox中都能工作。

    笔记:

    • 显然,由于许多其他原因,无效的HTML是最糟糕的做法。我正在开发的页面旨在与呈现周围HTML其余部分的母版页一起使用,但(出于各种原因)我是在独立于母版页测试它。
    • 我试着用一个简单的 <asp:Button runat="server"> ,但这会触发整页的回发刷新,因此不会出现相同的错误。作为一个web表单n00b,我不知道网格视图(或这个用例)有什么特别之处,它的行为会有所不同(即设置 onclick 处理程序处理单击而不加载页面)。
    • 我把这个标记为wiki,以防其他人能比我更好地解释这个问题。
    推荐文章