ASP.NET自定義控件加載資源WebResource問題


最近項目用日期控件,想把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久無果。

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM