将js文件打包进dll 方法3
我們在編寫 Server Control 的時候難免要用到一些客戶端腳本(javascript),如何把腳本和編譯好的dll一起發布就成了一個問題。把一段一段的javascript block寫在cs文件里是一件很“丑陋”的事情,javascript就應呆在*.js文件里。js文件怎樣才能“打包”到dll里呢?查了很多文檔,最后實踐下來發現有很多細節是需要注意的。整理出來,免得大家走彎路。廢話無多,讓我們開始。
Step 0: 我們已有的
1. 網站項目:Website1 ,其中:??
??????? Default.aspx (空頁面)
2. WebControl庫項目:WebControlLibrary1 ,其中:?
??????? ClientScriptResourceLabel.cs
using?System.Collections.Generic;
using?System.ComponentModel;
using?System.Text;
using?System.Web;
using?System.Web.UI;
using?System.Web.UI.WebControls;
namespace?WebControlLibrary1
{
????public?class?ClientScriptResourceLabel?:?WebControl
????{
????}
}
??????? script_include.js
function?DoClick()?{Form1.Message.value='Text?from?resource?script.'}?
Step 1:
在script_include.js文件的屬性窗口里,把Build Action改為:Embedded Resource
?
Step 2:
在ClientScriptResourceLabel.cs 中加入
namespace?WebControlLibrary1
{
....
注意這句是在namespace之外。你也可以把這句加在AssemblyInfo.cs文件里,.NET的類庫就是統一加在AssemblyInfo.cs文件里的。
很多文檔(包括MSDN)里都說通過以上兩步就可以把js文件作為資源,捆綁到dll中了。但實際上更不就不能用。我們用Reflector來看看編譯出來的到底是什么東東。
怎么變成 WebControlLibrary1.script_include.js 了?!問題是出在“默認名稱空間”。VS會自動把default namespace加到資源文件前面。其實只要把默認名稱空間該為空就可以了。令人郁悶的是VS2005正式版不允許把default namespace改為空(beta2是允許的)。怎么辦呢?難道要用麻煩的命令行來編譯嗎?還有一個辦法就是手工修改項目文件。
Step 3:
用寫字板打開WebControlLibrary1.csproj文件,把其中的RootNamespace 改為空
????<Configuration?Condition="?'$(Configuration)'?==?''?">Debug</Configuration>
????<Platform?Condition="?'$(Platform)'?==?''?">AnyCPU</Platform>
????<ProductVersion>8.0.50727</ProductVersion>
????<SchemaVersion>2.0</SchemaVersion>
????<ProjectGuid>{65431F13-ABAE-4281-A860-90FEC739AFED}</ProjectGuid>
????<OutputType>Library</OutputType>
????<AppDesignerFolder>Properties</AppDesignerFolder>?
????<RootNamespace></RootNamespace>?
????<AssemblyName>WebControlLibrary1.web</AssemblyName>
??</PropertyGroup>
這樣一來“默認名稱空間”就沒有了:
Step 4:
編譯WebControlLibrary1,這下得到的是我們想要的了:
Step 5 :?
調用腳本資源(ClientScriptResourceLable.cs)
????{
????????protected?override?void?OnPreRender(EventArgs?e)
????????{
????????????if?(this.Page?!=?null)
????????????{
????????????????ClientScriptManager?manager1?=?this.Page.ClientScript;
????????????????manager1.RegisterClientScriptResource(typeof(ClientScriptResourceLabel),?"script_include.js");
????????????}
????????????base.OnPreRender(e);
????????}
????}
?
?
Step 6 :
終于可以在頁面里使用包裝好的控件了(Default.aspx):
<%@?Register?Assembly="WebControlLibrary1"?Namespace="WebControlLibrary1"?TagPrefix="cc1"?%>
<html>
<head?runat="server">
????<title>Script?Resource</title>
</head>
<body>
????<form?id="Form1"?runat="server">
????????<div>
????????????<input?type="text"?id="Message">
????????????<input?type="button"?onclick="DoClick()"?value="ClientClick">
????????????<cc1:ClientScriptResourceLabel?ID="ClientScriptResourceLabel1"?runat="server"?/>
????????</div>
????</form>
</body>
</html>
生成的頁面是這樣的:
<html><head><title>
????Script?Resource
</title></head>
<body>
????<form?name="Form1"?method="post"?action="Default.aspx"?id="Form1">
<div>
<input?type="hidden"?name="__VIEWSTATE"?id="__VIEWSTATE"?value="/wEPDwUKLTkwOTU4NDc0OGRkO0UjKICXV1XisDv/KKM/wA+05FQ="?/>
</div>
<script?src="/WebSite1/WebResource.axd?d=E2u_4K_tSvgEe7jglgaDJYjGQkJj2ZwZEqAWVi3afWYe4CI30IeNjer7_ojoLKjr0&t=632688246616562500"?type="text/javascript"></script>
????????<div>
????????????<input?type="text"?id="Message">
????????????<input?type="button"?onclick="DoClick()"?value="ClientClick">
????????????<span?id="ClientScriptResourceLabel1"></span>
????????</div>
????</form>
</body>
</html>
其中的<script src="/WebSite1/WebResource.axd?d=...... 就是對腳本資源的調用。
注意:除了default namespace會影響編譯出來的腳本資源文件名外,文件所在的位置也會作為前綴加到文件名上。例如你把script_include.js放到 JS 目錄下,編譯出來就會變成 JS.scritp_include.js
轉載于:https://www.cnblogs.com/Nina-piaoye/archive/2013/03/07/2947875.html
總結
以上是生活随笔為你收集整理的将js文件打包进dll 方法3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Kernel ‘_xfs_b
- 下一篇: 第六讲:Obj-C 内存管理4 - 自动