configSections
????????????? <configSections>
?????????????????? <section name="NameM" type="LearningConfiguration.NameSectionHandler"/>
????????????? </configSections>
????????????? <NameM>
?????????????????? <Add key="name1" firstname="Jim" lastname="w1"/>
?????????????????? <Add key="name2" firstname="Chris" lastname="w2"/>
?????????????? </NameM> 說明: 在configSections下添加一個section子節點, 寫好標示名和類型, 然后在緊接這下面實現這個標示名的細節內容,就是我們當初想添加的自己的自定義信息了. 3. 實現IConfigurationSectionHandler唯一的方法: public object Create(object parent, object configContext, XmlNode section), 這里的最后一個參數就是自定義信息那個節點了, 粗體部分. 通過處理這堆信息, 返回你要的對象. 4. 使用這個返回的對象,通過System.Configuration.ConfigurationManager.GetSection()方法. 以下是示例代碼: (NameSectionHandler.cs) Code
namespace?LearningConfiguration
{
????public?class?NameSectionHandler?:?IConfigurationSectionHandler
????{
????????#region?IConfigurationSectionHandler?Members
????????public?object?Create(object?parent,?object?configContext,?XmlNode?section)
????????{
????????????Dictionary<string,?NameManagement>?names?=?new?Dictionary<string,?NameManagement>();
????????????
????????????string?key?=?string.Empty;
????????????string?firstName?=?string.Empty;
????????????string?lastName?=?string.Empty;
????????????foreach?(XmlNode?childNode?in?section.ChildNodes)
????????????{
????????????????if?(childNode.Attributes["key"]?!=?null)
????????????????{
????????????????????key?=?childNode.Attributes["key"].Value;
????????????????????if?(childNode.Attributes["firstname"]?!=?null)
????????????????????{
????????????????????????firstName?=?childNode.Attributes["firstname"].Value;
????????????????????}
????????????????????else
????????????????????{
????????????????????????firstName?=?string.Empty;
????????????????????}
????????????????????if?(childNode.Attributes["lastname"]?!=?null)
????????????????????{
????????????????????????lastName?=?childNode.Attributes["lastname"].Value;
????????????????????}
????????????????????else
????????????????????{
????????????????????????lastName?=?string.Empty;
????????????????????}
????????????????????names.Add(key,?new?NameManagement(firstName,?lastName));
????????????????}
????????????}
????????????return?names;
????????}
????????#endregion
????}
}
(NameManagement.cs) namespace?LearningConfiguration
{
????public?class?NameManagement
????{
????????string?_firstName;
????????public?string?FirstName
????????{
????????????get?{?return?this._firstName;?}
????????????set?{?this._firstName?=?value;?}
????????}
????????string?_lastName;
????????public?string?LastName
????????{
????????????get?{?return?this._lastName;?}
????????????set?{?this._lastName?=?value;?}
????????}
????????public?NameManagement(string?firstName,?string?lastName)
????????{
????????????this.FirstName?=?firstName;
????????????this.LastName?=?lastName;
????????}
????????public?string?RetrieveFullName()
????????{
????????????return?string.Format("{0}?{1}",?this.FirstName,?this.LastName);
????????}
????}
}
(Default.aspx.cs) namespace?LearningConfiguration
{
????public?partial?class?_Default?:?System.Web.UI.Page
????{
????????protected?void?Page_Load(object?sender,?EventArgs?e)
????????{
????????????Dictionary<string,?NameManagement>?names?=?ConfigurationManager.GetSection("NameM")?as?Dictionary<string,?NameManagement>;
????????????if?(names?!=?null)
????????????{?
????????????????foreach(string?key?in?names.Keys)
????????????????{
????????????????????NameManagement?name?=?names[key]?as?NameManagement;
????????????????????Response.Write(name.RetrieveFullName());
????????????????}
????????????}
????????}
????}
}
與以上調用方式一樣: Code
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Web;
using?System.Web.UI;
using?System.Web.UI.WebControls;
using?System.Configuration;
using?System.Collections.Specialized;
using?LearningConfiguation;
public?partial?class?Default4?:?System.Web.UI.Page
{
????protected?void?Page_Load(object?sender,?EventArgs?e)
????{
????????Dictionary<String,?NameManagement>?names?=?System.Configuration.ConfigurationManager.GetSection("test/aa")?as?Dictionary<String,?NameManagement>;
????????Dictionary<String,?NameManagement>.KeyCollection?keys?=?names.Keys;
????????foreach?(String?key?in?keys)
????????{
????????????NameManagement?nm?=?names[key]?as?NameManagement;
????????????Response.Write(nm.FirstName);
????????????Response.Write("<br>");
????????????Response.Write(nm.LastName);
????????}
????}
}
1.為什么需要自定義節點
為了增加應用程序的可移植性,通常網站需要配置一些自定義的節點,例如:文件上傳的路徑等,再深入的應用,可以定義工廠方法需要創建的類。
?
2.configSections使用方法
configSections節點下定義自定義節點可以幫我們實現我們自己的節點。
首先定義自己的節點,定義方法如下:
<configSections>
??? <sectionGroup name="section group name">
??????? <section name="section name" type="configuration section handler class" />
??? </sectionGroup>
</configSections>
定義自己的節點必須在configSections節點。
sectionGroup 元素充當 section 元素的容器。
section 元素將配置節處理程序與配置元素或節關聯。由于 ASP.NET 不對如何處理配置文件內的設置作任何假設,因此這非常必要。但 ASP.NET 會將配置數據的處理委托給配置節處理程序,(稍候說明。)每個 section 元素均標識一個配置節或元素。可以在 sectionGroup 元素中對 section 元素進行邏輯分組,以對 section 元素進行組織并避免命名沖突。section 和 sectionGroup 元素包含在 configSections 元素中。
sectionGroup節點屬性:
name:必選的 String 屬性,這是 group 元素在配置文件的節設置區域中使用的名稱。
section節點屬性:
name:必選的 String 屬性,指定與 type 屬性中指定的配置節處理程序關聯的配置節或元素的名稱。這是該元素在配置文件的節設置區域中使用的名稱。
type:必選的 String 屬性,指定用來執行如下操作的配置節處理程序類的名稱:處理在 name 屬性中指定的節或元素中的配置設置。
?
現在定義好了自己的節點,可以使用該節點了。使用方法如下:
<section group name>
??? <section name>
??????? <add key="key1" value="value1" />
??? </section name>
</section group name>
定義好了自己的節點,如何讀取節點信息呢?
以下是msdn上的原話:
您可以用自己的 XML 配置元素來擴展標準的 ASP.NET 配置設置集。若要完成該操作,您必須創建自己的配置節處理程序。
該處理程序必須是一個實現 System.Configuration.IConfigurationSectionHandler 接口或 System.Configuration.ConfigurationSection 類的 .NET Framework 類。
節處理程序解釋并處理 Web.config 文件特定部分中 XML 配置元素中定義的設置,并根據配置設置返回適當的配置對象。處理程序類返回的配置對象可以是任何數據結構;它不限于任何基配置類或配置格式。ASP.NET 使用該配置對象,以對自定義配置元素進行讀取和寫入。
上面這段話的意思就是說,我們要定義一個類,這個類要繼承自System.Configuration.IConfigurationSectionHandler 接口或 System.Configuration.ConfigurationSection 類。
然后用這個類來處理我們自定義的節點。
我們看到System.Configuration.IConfigurationSectionHandler接口中,只有一個方法:
//創建配置節處理程序
Object Create (Object parent, Object configContext, XmlNode section)
返回值
創建的節處理程序對象。
?
這個類是干什么用的呢?讓我們通過一個例子來看看。
?
首先,我們新建一個網站項目,并在web.config中加入以下節點:
<configSections>
??? <sectionGroup name="WebSiteInfo">
??????? <section name="basicInfo" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
??????? <section name="fileUpload" type="ConfigurationSectionTest.WebSiteInfoHandler"/>
??? </sectionGroup>
</configSections>
<WebSiteInfo>
??? <basicInfo>
??????? <add key="name" value="huchen's homepage"/>
??????? <add key="version" value="1.0"/>
??? </basicInfo>
??? <fileUpload>
??????? <add key="fileUploadPath" value="E:\\MyHomePage\\Web\\Upload\\"/>
??????? <add key="fileUploadSizeMax" value="2M"/>
??? </fileUpload>
</WebSiteInfo>
以上我們在WebSiteInfo節點下定義了兩個節點basicInfo和fileUpload,并定義了節點處理程序類ConfigurationSectionTest.WebSiteInfoHandler,并且隨后運用了我們定義的節點。
我們來看看節點處理程序ConfigurationSectionTest.WebSiteInfoHandler。
任意建立一個項目,新建一個類,或者直接在App_Code里新建一個類,如下:
并在Create函數中設置一個斷點。
?
?
namespace ConfigurationSectionTest
{
??? /// <summary>
??? ///WebSiteInfoHandler 的摘要說明
??? /// </summary>
??? public class WebSiteInfoHandler : IConfigurationSectionHandler
??? {
??????? public WebSiteInfoHandler()
??????? {
??????????? //
??????????? //TODO: 在此處添加構造函數邏輯
??????????? //
??????? }
??????? #region IConfigurationSectionHandler 成員
??????? public object Create(object parent, object configContext, System.Xml.XmlNode section)
??????? {
?????????? //這里我們首先返回個hello,并且在此處設置一個斷點。看看程序什么時候執行到這。
??????????? return "hello";
??????? }
??????? #endregion
??? }
}
然后在Default.aspx的Page_Load事件處理程序中去訪問我們自定義的節點,并在ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"); 這條語句上設置斷點。
protected void Page_Load(object sender, EventArgs e)
{
??? Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");
}
?
好了,我們啟動調試,看到程序首先執行到ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo");這句。
然后執行到ConfigurationSectionTest.WebSiteInfoHandler中的Create函數。
我們再看看這時處理函數中參數的值:
parent為null
configContext 為配置上下文對象。
section 的InnerXml為<add key="name" value="huchen's homepage" /><add key="version" value="1.0" />
?
按F11繼續執行return "hello", 繼續執行...
在執行到Object o = ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")后面的“}“,我們發現o的值為”hello”。
相信您已經明白的差不多了,當讀取自定義節點的內容時,程序去執行我們定義的節點處理程序,并把節點中的內容傳給Create函數中的參數。然后我們在Create中自己處理節點下的內容,并返回我們格式化后的節點內容給調用者,也就是ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo")。
注意:程序第一次運行的時候可以調試到Create這個方法,第二次運行的時候就調試不到了,這是因為配置文件時緩存了起來.
只有改變了配置文件或者繼承自IConfigurationSectionHandler的類才會重新調用.
?
好,知道這些以后,我們就來完善我們的代碼,我們在Create中處理傳進來的節點內容。
為了簡單起見,我們引入兩個類NameValueCollection,NameValueSectionHandler。
NameValueCollection:表示可通過鍵或索引訪問的關聯 String 鍵和 String 值的集合。
NameValueSectionHandler:提供配置節中的名稱/值對配置信息。NameValueSectionHandler 這個類也繼承IConfigurationSectionHandler
反編譯可以看出NameValueSectionHandler 的Create方法把參數section的結果轉化成了一個集合,就是NameValueCollection。
那么我們可以在節點處理程序中的Create函數中寫如下代碼:
NameValueCollection configs;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
configs =(NameValueCollection)baseHandler.Create(parent,configContext,section);
Return configs;
?
這樣我們就可以這樣訪問我們的節點了:
string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];
在Default.aspx的Page_Load事件處理程序中添加如下代碼:
string myWebSiteName = ((NameValueCollection)ConfigurationSettings.GetConfig("WebSiteInfo/basicInfo"))["name"];
Response.Write(myWebSiteName);
Ctrl+F5運行,可以看到頁面輸出了huchen's homepage
?
轉載于:https://www.cnblogs.com/jhxk/articles/1609182.html
總結
以上是生活随笔為你收集整理的configSections的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标签内联事件和event对象
- 下一篇: VC++ 6.0 中如何使用 CRT 调