尝试将自定义 Javascript 集成到 ASP.NET webforms 应用程序时遇到麻烦

Trouble after trouble trying to integrate custom Javascript into an ASP.NET webforms app

我在这里泡菜....

我正在尝试创建一个新的、非常标准的 ASP.NET Webforms 应用程序,以 .NET 4.5.2 为目标。我以前做过很多次 - 但从来没有 运行 进入这些问题(并且不能完全弄清楚 为什么 它们现在会发生,以前从未发生过......)。

我的客户提供了一组 CSS 和 Javascript 作为项目的基础,其中包括 Bootstrap 和 jQuery。

现在,当我试图让我的第一个简单页面工作时,我 运行 遇到了严重的麻烦,因为我要在我的页面中包含一些额外的 Javascript。

尝试 #1

我试图像这样包含我的 Javascript 文件:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="Web.MyMaster" %>
<!DOCTYPE html>
<html lang="en" class="no-js no-ie">
<head runat="server">
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=$start">
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <webopt:BundleReference runat="server" Path="~/Content/css" />

    <!-- Favicons -->
    <link rel="shortcut icon" href="~/Images/Icons/favicon.ico" />

    <!-- Scripts -->
    <script type="text/javascript" src="/Scripts/vendors.min.js"></script>
    <script type="text/javascript" src="/Scripts/jquery.validate.min.js"></script>

    <asp:ContentPlaceHolder ID="HeaderContent" runat="server"></asp:ContentPlaceHolder>
</head>

这似乎行得通 - 直到我第一次部署到我们的测试环境。在那里,应用程序不是 "rooted",例如它们安装在 IIS 设置中,其中应用程序的路径是 http://test.server.com/apps/MyApp - 现在我对 /Scripts/.... 的引用全部中断并且找不到任何内容

尝试 #2

我尝试更改脚本的包含以使用我之前使用的 ResolveUrl() 方法:

<!-- Scripts -->
<script type="text/javascript" src="<%= ResolveUrl("~/Scripts/vendors.min.js") %>"></script>
<script type="text/javascript" src="<%= ResolveUrl("~/Scripts/jquery.validate.min.js") %>"></script>

所以在这种情况下,ASP.NET 应该 根据应用程序的根目录(无论它在哪里)解析这些名称并包含这些脚本。

麻烦:现在我收到一个错误(在启动时)说类似(自由 t运行 从德语):

The control collection cannot be modified since the control contains code blocks (e.g. <% ... %>)

不好意思?!?!?!?!?!

尝试 #3

所以我最后的办法是使用这样的数据绑定表达式:

<!-- Scripts -->
<script type="text/javascript" src="<%# ResolveUrl("~/Scripts/vendors.min.js") %>"></script>
<script type="text/javascript" src="<%# ResolveUrl("~/Scripts/jquery.validate.min.js") %>"></script>

这需要我做一个

Page.Header.DataBind();

在母版页的 OnInit 事件处理程序中,一旦我这样做,当我尝试使用 DevExpress 网格时,我得到一个讨厌的错误:

Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.

好的,所以我的智慧到了尽头-我怎么能我能包括一些吗Javascript 文件到 ASP.NET Webforms 应用 今天 ,在 2016 年,这样 一切正常 - 没有令人讨厌的 .NET 错误,没有 Javascript 没有找到.......你有什么方法来解决我的这个困境??

WebForms 在脚本标签方面很特别。您可以做的一件事是使用 ScriptManager as described on this answer

此外,如果您从 <head> 标签中删除了 runat="server",则尝试 #2 会奏效。如果您不从代码隐藏访问 head 标记,则无需将其作为服务器控件。

或者,对于更 "modern" 的方法,ASP.NET Bundling and Minification 内容也适用于 WebForms。我已经在几个项目中使用它,没有任何问题。