最近項目用日期控件,想把My97的資源文件跟TextBox封裝成一個DatePicker控件,其實很簡單的意見事情,但是還是用了一天多的時間,主要的問題就是解決資源文件加載的問題。通過一天多的努力,得出下面的結論:
1、自定義控件中,一般只要加載JS文件,但是所有的資源文件都需要在AssemblyInfo.cs中注冊。具體方式如下:
1.1、控件中注冊JS文件代碼:
/// <summary> /// 注冊JS /// </summary> /// <param name="e"></param> protected override void OnPreRender(EventArgs e) { Page.ClientScript.RegisterClientScriptInclude("WdatePicker", GetResUrl("WdatePicker.js")); base.OnPreRender(e); } /// <summary> /// 獲取JS文件路徑 /// </summary> /// <param name="strName"></param> /// <returns></returns> private string GetResUrl(string strName) { return Page.ClientScript.GetWebResourceUrl(GetType(), "Founder.Framework.Web.UI.WebControls.FIDatePicker.Resource." + strName); }
1.2、AssemblyInfo.cs中注冊資源文件代碼:
//My97資源文件 [assembly: WebResource("Founder.Framework.Web.UI.WebControls.FIDatePicker.Resource.WdatePicker.js", "text/javascript")]
2、如果JS中需要通過相對路徑引用CSS文件,那么將資源文件嵌入到DLL的方法是不行的,不能通過相對路徑找資源,需要把相對路徑改成http://localhost/cmd2.0/WebResource.axd?d=WLbEEdvLp5nx1XFfQ8MUMXnmSqTu_IhZyNtDZskTQa4OjNpOfsH9sqWwz8LLXYpbWPqCID9cFVyVg4I0ha1vNBHPJSbo6jMHbBiUM63WFC2gr6hYonIxQ9r03VB6jhowyzDi23srRj9hfI4sfmUSV3CaI87aJd9Qg28Jy6CH1vC4tAlxqtIpyd7FDaix8-HNNXrnQXgGnjdLQxqPkemk2agkxbQQpwJVEEoCudFcYBM1&t=635400916300729758這種路徑。
還有一種方式是,把資源文件放在Web站點目錄中,通過相對路徑去訪問。
3、當遇到http://localhost/cmd2.0/WebResource.axd?d=WLbEEdvLp5nx1XFfQ8MUMXnmSqTu_IhZyNtDZskTQa4OjNpOfsH9sqWwz8LLXYpbWPqCID9cFVyVg4I0ha1vNBHPJSbo6jMHbBiUM63WFC2gr6hYonIxQ9r03VB6jhowyzDi23srRj9hfI4sfmUSV3CaI87aJd9Qg28Jy6CH1vC4tAlxqtIpyd7FDaix8-HNNXrnQXgGnjdLQxqPkemk2agkxbQQpwJVEEoCudFcYBM1&t=635400916300729758這種訪問不到的資源時,需要仔細查看注冊資源的地方,是不是文件名或者路徑不對,如果真的看不出來,可以通過反射System.Web的方式解析這個字符處,看看到底是哪個文件出錯了。具體代碼如下:
Type type = typeof(System.Web.UI.Page);//獲取Page類型 MethodInfo methods = type.GetMethod("DecryptString", BindingFlags.NonPublic | BindingFlags.Static);//獲取解密的方法 object obj = Activator.CreateInstance(type, null); object[] args = { this.txtOldValue.Text }; this.txtNewValue.Text = methods.Invoke(obj, args).ToString();
4、解密是需要注意兩個問題:
4.1、解密的代碼需要在同一個站點中,不能獨立於出錯的站點來解密。
4.2、最新的4.0版本的System.Web.dll的DecryptString方法有兩個參數,不曉得如何用,反正我測試N久無果。