Web.config自定义节点

79 篇文章 1 订阅
23 篇文章 0 订阅

参考资料:关于ConfigurationManager.GetSection()方法

首先建立一个MVC项目,项目名字叫MvcApp,然后再项目的Models文件夹下创建一个自定义类,这里我创建的这个类取名叫ContactUsSectionHandler.cs,这个类继承自IConfigurationSectionHandler 这个接口。这个类的作用就是用来获取到Web.config配置文件中的这个ContactUs节点的内容

ContactUsSectionHandler.cs类

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml;

namespace MvcApp.Models
{
    public class ContactUsSectionHandler : IConfigurationSectionHandler
    {
        private XmlNode _sectionNode;
        public XmlNode SectionNode
        {
            get { return _sectionNode; }
        }

        //当调用ConfigurationManager.GetSection("ContactUsSection")方法时,如果某个类继承IConfigurationSectionHandler接口,那么会触发此接口的Create方法,此时ConfigurationManager.GetSection("ContactUsSection")获取到的Web.config配置文件中的ContactUsSection节点就会传递到 Create方法的第三个参数section上。所以此时section中保存的内容就是Web,config配置文件中的ContactUsSection这个节点的内容
        public virtual object Create(object paarnet, object context, XmlNode section)//实现IConfigurationSectionHandler接口中的Create方法
        {
            this._sectionNode = section; //初始化私有成员_sectionNode

            return this; //这个this 其实就是 MvcApp.Models.ContactUsSectionHandler 类的对象。因为我已经在Create方法中将Web.config配置文件中的ContactUsSection这个节点赋值给当前类ContactUsSectionHandler的一个私有属性_sectionNode了。 所以这里这里就可以返回当前类的一个对象啦。
        }

    }
}

接收Web.config配置文件中的这个ContactUsSection节点的类定义好了。下面就来在Web.config里面自定义的ContactUsSection的节点

Web.cofig配置文件

<?xml version="1.0" encoding="utf-8"?>
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
  <configSections >

    <!--既然要自定义一个ContactUsSection节点,就需要先在<configSections></configSections>这个节点里声明一下自定义节点的名称及类型-->
    <!--这个type表示节点的类型是什么,其实就是表明如果你要获取这个节点的时候,用哪个类来保存这个ContactUsSection节点的内容。 我这里是用MvcApp项目下的Models文件夹下的ContactUsSectionHandler类来保存ContactUsSection这个节点的内容。逗号后面的MvcApp是项目名称-->
    <section name="ContactUsSection" type="MvcApp.Models.ContactUsSectionHandler,MvcApp"/>
  </configSections>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

  <system.web>

    <httpRuntime targetFramework="4.5" />

    <compilation debug="true" targetFramework="4.5" />

    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

  <!--自定义一个ContactUsSection节点-->
  <ContactUsSection>
    
    <ContactUs>
      <SMTP host="smtp.qq.com" port="587" EnableSsl="true" UseDefaultCredentials="">
        <From password="123456" displayname="">12345678910@qq.com</From>
        <To>98765432101@qq.com</To>
        <Cc>mono@163.com</Cc>
        <Bcc></Bcc>

      </SMTP>
      <Subject>wowo.mm.com - #?organization?#</Subject>
      <Template>
        <![CDATA[ 
          <div> 
              First Name: #?firstname?#<br/><br/> 
              Last Name: #?lastname?#<br/><br/> 
              Job Title: #?jobtitle?#<br/><br/> 
              Company Name: #?organization?#<br/><br/> 
              Country: #?country?#<br/><br/> 
              Business Email: <a href='mailto:#?businessemail?#' target='blank'>#?businessemail?#</a><br/><br/> 
              Phone Number: #?phonenumber?#<br/><br/> 
              Area of Interest: #?inquiry?#<br/><br/> 
              Message: #?message?# 
          </div> 
        ]]>

      </Template>
    </ContactUs>
    
    <EmailOverload trigger="500">
      <SMTP host="127.0.0.1" port="25" EnableSsl="" UseDefaultCredentials="">
        <From password="" displayname="NCXM">yes@163.com</From>
        <To>wowo@163.com</To>
      </SMTP>      
      <Subject>警告消息</Subject>
      <Template>
        <![CDATA[ 
       There were over #?trigger?# emails HAHA.<br/><br/> 
       Hour 0 : #?00?#<br/> 
       Hour 1 : #?01?#<br/> 
       Hour 2 : #?02?#<br/> 
       Hour 3 : #?03?#<br/> 
       Hour 4 : #?04?#<br/> 
       Hour 5 : #?05?#<br/> 
       Hour 6 : #?06?#<br/> 
       Hour 7 : #?07?#<br/> 
       Hour 8 : #?08?#<br/> 
       Hour 9 : #?09?#<br/> 
       Hour 10 : #?10?#<br/> 
       Hour 11 : #?11?#<br/> 
       Hour 12 : #?12?#<br/> 
        Hour 13 : #?13?#<br/> 
        Hour 14 : #?14?#<br/> 
        Hour 15 : #?15?#<br/> 
        Hour 16 : #?16?#<br/> 
        Hour 17 : #?17?#<br/> 
        Hour 18 : #?18?#<br/> 
        Hour 19 : #?19?#<br/> 
        Hour 20 : #?20?#<br/> 
        Hour 21 : #?21?#<br/> 
        Hour 22 : #?22?#<br/> 
        Hour 23 : #?23?#<br/> 
        ]]>
      </Template>
    </EmailOverload>
    
    <AdobeTracking>
      <PostUrl>http://ccr.com.drc4.scd.omddtrdc.net/b/ss//88</PostUrl>
      <Template>
        <![CDATA[ 
             <request> 
                  <sc_xml_ver>1.0</sc_xml_ver> 
                  <pageURL>#?cururl2?#</pageURL> 
                  <referrer>#?cururl?#</referrer> 
                  <ipAddress>#?ipaddr?#</ipAddress> 
                  <pageName>home:contact us</pageName> 
                  <channel>contact us</channel> 
                  <events>event44</events> 
                  <contextData> 
                    <crm> 
                      <enquiryType>general</enquiryType> 
                    </crm> 
                  </contextData> 
                  <contextData> 
                    <pageInfo> 
                    <siteName>#?sname?#</siteName> 
                    </pageInfo> 
                  </contextData> 
                  <contextData> 
                    <pageInfo> 
                      <geoRegion>#?georegion?#</geoRegion> 
                    </pageInfo> 
                  </contextData> 
                  <contextData> 
                    <pageInfo> 
                      <leadSource>#?lead?#</leadSource> 
                    </pageInfo> 
                  </contextData> 
                  <contextData> 
                    <crm> 
                      <prospectCountry>#?pcountry?#</prospectCountry> 
                    </crm> 
                  </contextData> 
                  <contextData> 
                    <crm> 
                      <industry>#?selected_subject2?#</industry> 
                    </crm> 
                  </contextData> 
                  <prop75>xml</prop75> 
                  <userAgent>#?useragent?#</userAgent> 
                  <marketingCloudVisitorID>#?mcid?#</marketingCloudVisitorID> 
                  <visitorID>#?analyticsid?#</visitorID> 
                  <reportSuiteID>#?aacoun?#</reportSuiteID> 
             </request>"        
      ]]>        
      </Template>
      
    </AdobeTracking>

    <User>
      <UserInfo name="张三" age="25" Gender="1"/>
      <UserInfo name="李四" age="26" Gender="0"/>
      <UserInfo name="王五" age="28" Gender="1"/>
    </User>
  </ContactUsSection>
</configuration>

接收类,和配置文件都定义好后,看我们如何来使用它

创建Home控制器

using MvcApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            //调用ConfigurationManager.GetSection("ContactUsSection")方法,获取Web.config配置文件中的ContactUsSection节点的内容,
            //注意:Web.config配置文件中的ContactUsSection节点的内容保存在ContactUsSectionHandler类的私有属性_sectionNode中
            //注意:_sectionNode属性的类型是XmlNode类型的,所以它可以保存ContactUsSection节点的内容
            ContactUsSectionHandler section = System.Configuration.ConfigurationManager.GetSection("ContactUsSection") as ContactUsSectionHandler;

            return View();
        }

    }
}




============================================================

好了。我们在看看如何利用ContactUsSection这个节点下的信息或初始化一个类

首先我们在Models文件夹下再创建一个User的类

User类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApp.Models
{
    public class User
    {
        public string Name { get; set; }

        public string Age { get; set; }

        public string Gender { get; set; }

        //在这里类里还可以做很多事情
    }
}

 然后再ContactUsSectionHandler.cs 写初始化User类的的代码

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml;

namespace MvcApp.Models
{
    public class ContactUsSectionHandler : IConfigurationSectionHandler
    {
        private XmlNode _sectionNode;
        public XmlNode SectionNode
        {
            get { return _sectionNode; }
        }

        //当调用ConfigurationManager.GetSection("ContactUsSection")方法时,如果某个类继承IConfigurationSectionHandler接口,那么会触发此接口的Create方法,此时ConfigurationManager.GetSection("ContactUsSection")获取到的Web.config配置文件中的ContactUsSection节点就会传递到 Create方法的第三个参数section上。所以此时section中保存的内容就是Web,config配置文件中的ContactUsSection这个节点的内容
        public virtual object Create(object paarnet, object context, XmlNode section)//实现IConfigurationSectionHandler接口中的Create方法
        {
            this._sectionNode = section; //初始化私有成员_sectionNode

            return this; //这个this 其实就是 MvcApp.Models.ContactUsSectionHandler 类的对象。因为我已经在Create方法中将Web.config配置文件中的ContactUsSection这个节点赋值给当前类ContactUsSectionHandler的一个私有属性_sectionNode了。 所以这里这里就可以返回当前类的一个对象啦。
        }



        //因为ContactUsSection这个节点下面还有其他的子节点,每个子节点都会有独立的功能。现在我们就写个例子

        //获取User这个类的实例,其实获取的是一个List<User>对象
        public List<User> GetUserInstance()
        {
            List<User> list = new List<User>();
            InitializeUser(list);
            return list;
        }

        //初始化User
        public void InitializeUser(List<User> list)
        {
            XmlNode node = null;
            foreach (XmlNode chilNode in _sectionNode)
            {
                //如果子节点的名称为User的这个节点
                if (chilNode.Name.ToLower() == "User".ToLower())
                {
                    node = chilNode;
                    break;
                }
            }

           //遍历User这个节点
            foreach (XmlNode childNode in node.ChildNodes)
            {
                User user = new User();
                user.Name = childNode.Attributes["name"].Value;
                user.Age = childNode.Attributes["age"].Value;
                user.Gender = childNode.Attributes["gender"].Value;
                list.Add(user);
            }
        }

    }
}
写好代码后,我们来Home控制器中来调用

using MvcApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            //调用ConfigurationManager.GetSection("ContactUsSection")方法,获取Web.config配置文件中的ContactUsSection节点的内容,
            //注意:Web.config配置文件中的ContactUsSection节点的内容保存在ContactUsSectionHandler类的私有属性_sectionNode中
            //注意:_sectionNode属性的类型是XmlNode类型的,所以它可以保存ContactUsSection节点的内容
            ContactUsSectionHandler section = System.Configuration.ConfigurationManager.GetSection("ContactUsSection") as ContactUsSectionHandler;

            List<User> user = section.GetUserInstance();

            return View();
        }

    }
}

我们可以看到user这个对象有三项


上面仅仅是举了一个例子而已。当然我们还可以用节点来做很多很多事情




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值