“Sys”未定义 - Ajax - 主控和内容页面 ASP.NET 4.0

4

我已经遇到了这个问题有一段时间了,并尝试了各种解决方案,使用不同的标记编辑Webconfig。

我在网页上使用了Updatepanels、计时器和AJAX。(是否可能是AJAX引起的错误?)

我真的不知道如何定义这个问题,因为我真的不知道该去追踪哪里。

我在主页面上的body中放置了一个onload(不知道是否正确)下面是一些标记代码和我认为引发错误的Javascript代码。

主页面:

<!DOCTYPE html>
<html lang="en">
<head runat="server">
    <meta charset="utf-8" />
    <title><%: Page.Title %> - </title>
    <link href="~/Content/Site.css" rel="stylesheet" /> 
    <link href="~/Content/BarChart.css" rel="stylesheet" />
    <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <asp:PlaceHolder runat="server">        
        <script src="<%: ResolveUrl("~/Scripts/_references.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/modernizr-2.5.3.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/jquery-1.7.1.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/jquery-1.7.1.min.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/jquery-ui-1.8.20.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/jquery-ui-1.8.20.min.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/ButtonManager.js") %>"></script>
        <script src="<%: ResolveUrl("~/Scripts/BarChart.js") %>"></script>
    </asp:PlaceHolder>
    <meta name="viewport" content="width=device-width" />
    <asp:ContentPlaceHolder runat="server" ID="HeadContent" />
</head>
<body >
    <form runat="server">
    <asp:ScriptManager runat="server">
        <Scripts>
            <asp:ScriptReference Name="jquery" />
            <asp:ScriptReference Name="jquery.ui.combined" />
        </Scripts>
    </asp:ScriptManager>
    <header>
        <div class="content-wrapper">
            <div class="float-left">
                    <asp:ImageButton ID="Logo" cssclass="site-title" runat="server" PostBackUrl="~/" ImageUrl="~/Images/Logo.png" />
            </div>
            <div class="float-right">
                <section id="login">
                    <asp:LoginView runat="server" ViewStateMode="Disabled">
                        <AnonymousTemplate>
                            <ul>
                                <li><a id="registerLink" runat="server" href="~/Account/Register.aspx">Register</a></li>
                                <li><a id="loginLink" runat="server" href="~/Account/Login.aspx">Log in</a></li>
                            </ul>
                        </AnonymousTemplate>
                        <LoggedInTemplate>
                            <p>
                                Hello, <a runat="server" class="username" href="~/Account/Manage.aspx" title="Manage your account">
                                    <asp:LoginName runat="server" CssClass="username" />
                                </a>!
                                <asp:LoginStatus runat="server" LogoutAction="Redirect" LogoutText="Log off" LogoutPageUrl="~/" />
                            </p>
                        </LoggedInTemplate>
                    </asp:LoginView>
                </section>
                <nav>
                    <ul id="menu">
                        <li><a runat="server" href="~/">Home</a></li>
                        <li><a runat="server" href="~/Barchart.aspx">About</a></li>
                        <li><a runat="server" href="~/Contact.aspx">Contact</a></li>
                    </ul>
                </nav>
            </div>
        </div>
    </header>
    <div id="body">
        <asp:ContentPlaceHolder runat="server" ID="FeaturedContent" />
        <section class="content-wrapper main-content clear-fix">
            <asp:ContentPlaceHolder runat="server" ID="MainContent" />            
        </section>
    </div>
    <footer>
        <div class="content-wrapper">
            <div class="float-left">
                <p>&copy; <%: DateTime.Now.Year %> - My ASP.NET Application</p>
            </div>
        </div>
    </footer>  
    </form>
</body>
</html>

内容页面:

<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
</asp:Content>
<asp:Content runat="server" ID="BodyContentHome" ContentPlaceHolderID="MainContent" >
    <asp:Panel ID="UpdatepanelWrapper" CssClass="Updatepanelwrapper" runat="server">
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" >
            <ContentTemplate>
                <asp:PlaceHolder runat="server" ID="WholeWrapper">

                    <asp:PlaceHolder runat="server" ID="QuestionWrapper">
                        <asp:PlaceHolder runat="server" ID="LabelQuestion"></asp:PlaceHolder>
                        <asp:PlaceHolder runat="server" ID="Question"></asp:PlaceHolder>                        
                    </asp:PlaceHolder>
                </asp:PlaceHolder>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="btnAdd" EventName="Click" />
                <asp:AsyncPostBackTrigger ControlID="btnDelete" EventName="Click" />
            </Triggers>

        </asp:UpdatePanel>    
        <asp:Panel ID="ButtonPanel" CssClass="ButtonPanel" runat="server">
            <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="~/Images/Deleteicon.png" CssClass="DeleteButtonHidden" OnClientClick="btnDelete_Click" />
            <asp:ImageButton ID="btnAdd" runat="server" ImageUrl="~/Images/Addicon.png" CssClass="AddButtonMoreMargin" OnClientClick="btnAddQuestion_Click" />
        </asp:Panel>
        </asp:Panel>  
    <asp:Button ID="btnSendQuestions" runat="server" Text="Skapa Föreläsning och frågor" OnClick="btnSendQuestions_Click" ValidationGroup="QuestionGroup" />

</asp:Content>

JavaScript 代码:

if (window.addEventListener) window.addEventListener("load", load(), true);
else window.onload = load();

function load() {
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
}

function EndRequestHandler(sender, args) {
// NOT IMPORTANT
}

这个脚本是在js文件中吗?顺便问一下,为什么你要两次引用jquery和jquery-ui库? - Yuriy Rozhovetskiy
我首先会检查ScriptResource.axd文件是否返回有效的JavaScript(或根本没有)。 我相信这就是Sys定义的地方。 这可能表明您的ScriptManager是否设置正确。 - OptimizedQuery
我看到你包含了许多版本的jQuery,包括压缩和非压缩版本。这可能会在页面上产生许多其他错误,并且也会使您失去系统。您能否查看是否有其他JavaScript错误? - Aristos
双重引用只是一些默认主页面带来的东西,我想。我没有添加它。我只添加了我的自己的.js文件,Barchart和ButtonManager。ScriptResource.axd似乎没问题,那里没有错误。唯一抛出的错误是在我的JavaScript文件中,如原始帖子所示。每次我点击由我的UpdatePanel触发的按钮时,都会发生错误,如Contentpage中所示。该错误说: “未捕获的引用错误:btnAddQuestion_Click未定义 onclick”但是当我点击它时,我的JavaScript就像魅力一样工作。 - J.Olsson
6个回答

9

我想我解决了这个问题。我知道函数是在DOM构建之前运行的。

所以我只需要这样做:

$(document).ready(function () {
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
});

一个问题仍然存在。 当我点击ImageButton btnAdd时, 控制台显示:
Uncaught ReferenceError: btnAddQuestion_Click is not defined
onclick

这将直接指向我编写ImageButton的代码行。

Internet Explorer对此非常不友好,但其他浏览器会像什么都没有发生一样继续执行,即使错误消息出现在开发者控制台中。

按钮功能也可以正常使用,唯一的问题是错误信息。

编辑:问题已经解决。我之前使用了"OnClientClick",改成了OnClick就解决了这个问题。 我不知道这两者之间的区别,但只要它能工作,我就很高兴。


1
OnClientClick="btnAddQuestion_Click" 将在客户端寻找名为 btnAddQuestion_Click 的方法,也就是说,在您的 JavaScript 中,因此您会收到“btnAddQuestion_Click 未定义”的错误。使用 OnClick="btnAddQuestion_Click" 将尝试在服务器上执行名为 btnAddQuestion_Click 的方法,也就是说,在您的代码后台中。OnClientClick 首先被执行,只有在客户端方法返回 true 时,请求才会通过传递到服务器上指定的 OnClick 属性中的方法。 - Nope

2
在我的情况下,我发现罪魁祸首是在覆盖函数/方法OnPreRenderComplete时漏掉了对MyBase.OnPreRenderComplete(e)的调用。
包括对MyBase.OnPreRenderComplete(e)的调用后,一切都能正常工作。 如果漏掉对MyBase.OnPreRenderComplete(e)的调用,则会收到错误信息“Uncaught ReferenceError: Sys is not defined”,许多功能将无法正常工作。
Protected Overrides Sub OnPreRenderComplete(ByVal e As EventArgs) 'MyBase.OnPreRenderComplete(e) ... End Sub

2

您只需要在脚本管理器中设置EnableCdn="true",如下所示:

<asp:ScriptManager ID="ScriptManager1" runat="server" EnableCdn="true" />

基本上,由于某种原因未下载Sys库,如果你设置EnableCdn="true",它将使用Microsoft的内容传递网络(CDN)下载所需的脚本,包括Sys库。
我在这篇帖子中有更详细的解释。

0
另一种解决方案是将脚本标签放置在您的Web表单或主页面底部的HTML关闭标记之前:
<html>
   <body>
    .
    .
    .
   </body>
   <script type="text/javascript" src="/scripts/script.js"></script>
</html>

如果使用主页面的Web表单,则必须将脚本标记放置在关闭的</asp:Content>标记之前。


0
在我的情况下,问题是我放置了以下代码以在部分回发后保留gridview表头:
protected override void OnPreRenderComplete(EventArgs e)
{
    if (grv.Rows.Count > 0)
    {
        grv.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
}

删除此代码解决了问题。


1
删除 OnPreRenderComplete 事件及其定义,以使其不再起作用。 - Gaurang Dhandhukiya

0

针对asp.net页面

只需在页面上添加 Scriptmanager。

如何添加呢? 前往工具栏(Visual Studio 左侧)-> AJAX 扩展 -> Scriptmanager -> 双击或拖放

:)


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