2016-06-28 21 views
3

我在這裏泡菜....麻煩試圖將自定義Javascript集成到ASP.NET webforms應用程序

我試圖創建一個新的,非常標準的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> 

這似乎工作 - 直到我部署到我們的測試環境的第一次。在那裏,這些應用程序不是「根植」的,例如,他們安裝在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 解決基於應用程序的根目錄下(不管是)這些名稱和包括茨艾倫e腳本。

麻煩:現在我得到一個錯誤(在啓動時)說像(德國自由翻譯):

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> 

,這需要我在OnInit

Page.Header.DataBind(); 

母版頁的事件處理程序,並且一旦我嘗試使用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.

OK,所以我在我的智慧結束 - 如何在地球上我可以包括一些JavaScript文件到ASP.NET Web表單應用程序今天,在2016年,使一切正常工作 - 沒有討厭的.NET錯誤,沒有找不到Javascript .......你有什麼辦法來解決這個我的困境?

+0

您的頁面是否駐留在應用程序根目錄中?如果是這樣,你可以簡單地使用相對URL,例如''。 –

+0

@FrédéricHamidi:不,我的頁面位於 –

回答

2

當涉及到腳本標記時,WebForms是特殊的。有一兩件事你可以做的是使用一個ScriptManager作爲this answer

描述此外,如果您從<head>標籤移除runat="server"嘗試#2會的工作。如果您沒有從代碼隱藏中訪問頭標,則無需將其作爲服務器控件。

或者,對於更「現代」的方法,ASP.NET Bundling and Minification的東西也適用於WebForms。我已經在幾個項目中使用它,沒有任何問題。

+0

的幾個子文件夾和子文件夾中如果我從''刪除'runat ='server'',我不能再設置'Page.Title'屬性.... –

+0

至於捆綁和縮小:*聽起來像一個好主意,但我有很多問題 - 嘗試將各種'* .js'文件合併到一個包中,但是當試圖添加該包時「name)到腳本管理器,我不斷收到關於」這需要有一個.js擴展名「的錯誤和類似的東西.....從來沒有爲我工作過(但) –

+0

你應該能夠使用'<% Scripts.Render(「〜/ bundle/path」)%>',但你可能會遇到與服務器頭標記一樣的嘗試2的問題... – jrummell