2012-05-06 3 views
1

Вот мой XML-структура:Возможно ли выполнить эту конфигурацию?

<reco> 
    <styleSheets> 
     <group> 
     <asset source="~/Script/file1.css"/> 
     <asset source="~/Script/file2.css"/> 
     <asset source="~/Script/file3.css"/> 
    </group> 
    </styleSheets> 
    <scripts> 
    <group> 
     <asset source="~/Content/file1.js"/> 
     <asset source="~/Content/file1.js"/> 
     <asset source="~/Content/file1.js"/> 
    </group> 
    </scripts> 

Вот мой код:

public class AssetConfigurationElement : ConfigurationElement 
{ 

    /// <summary> 
    /// Gets or sets the source. 
    /// </summary> 
    /// <value>The source.</value> 
    [ConfigurationProperty("source", IsRequired = true, IsKey = true)] 
    public string Source 
    { 
     get 
     { 
      return (string)this["source"]; 
     } 

     set 
     { 
      this["source"] = value; 
     } 
    } 
} 

public class GroupConfigurationElementCollection : ConfigurationElementCollection 
{ 
    public GroupConfigurationElementCollection() 
    { 
     AddElementName = "asset"; 
    } 

    /// <summary> 
    /// Gets or sets the name. 
    /// </summary> 
    /// <value>The name.</value> 
    [ConfigurationProperty("name", IsRequired = true, IsKey = true, IsDefaultCollection = true)] 
    public string Name 
    { 
     get 
     { 
      return (string)this["name"]; 
     } 

     set 
     { 
      this["name"] = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether this <see cref="WebAssetGroupConfigurationElement"/> is enabled. 
    /// </summary> 
    /// <value><c>true</c> if enabled; otherwise, <c>false</c>.</value> 
    [ConfigurationProperty("enabled", DefaultValue = true)] 
    public bool Enabled 
    { 
     get 
     { 
      return (bool)this["enabled"]; 
     } 

     set 
     { 
      this["enabled"] = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets the version. 
    /// </summary> 
    /// <value>The version.</value> 
    [ConfigurationProperty("version")] 
    public string Version 
    { 
     get 
     { 
      return (string)this["version"]; 
     } 

     set 
     { 
      this["version"] = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether this <see cref="WebAssetGroupConfigurationElement"/> is compress. 
    /// </summary> 
    /// <value><c>true</c> if compress; otherwise, <c>false</c>.</value> 
    [ConfigurationProperty("compress", DefaultValue = true)] 
    public bool Compress 
    { 
     get 
     { 
      return (bool)this["compress"]; 
     } 

     set 
     { 
      this["compress"] = value; 
     } 
    } 

    /// <summary> 
    /// Gets or sets a value indicating whether this <see cref="WebAssetGroupConfigurationElement"/> is combined. 
    /// </summary> 
    /// <value><c>true</c> if combined; otherwise, <c>false</c>.</value> 
    [ConfigurationProperty("combined", DefaultValue = true)] 
    public bool Combined 
    { 
     get 
     { 
      return (bool)this["combined"]; 
     } 

     set 
     { 
      this["combined"] = value; 
     } 
    } 


    protected override ConfigurationElement CreateNewElement() 
    { 
     return new AssetConfigurationElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((AssetConfigurationElement)element).Source; 
    } 

} 

public class SharedGroupConfigurationSection : ConfigurationSection 
{ 

    /// <summary> 
    /// Gets the style sheets. 
    /// </summary> 
    /// <value>The style sheets.</value> 
    [ConfigurationProperty("styleSheets")] 
    [ConfigurationCollection(typeof(GroupConfigurationElementCollection), AddItemName = "group")] 
    public GroupConfigurationElementCollection StyleSheets 
    { 
     get 
     { 
      return (GroupConfigurationElementCollection)base["styleSheets"] ?? new GroupConfigurationElementCollection(); 
     } 
    } 

    /// <summary> 
    /// Gets the style sheets. 
    /// </summary> 
    /// <value>The style sheets.</value> 
    [ConfigurationProperty("scripts")] 
    [ConfigurationCollection(typeof(GroupConfigurationElementCollection), AddItemName = "group")] 
    public GroupConfigurationElementCollection Scripts 
    { 
     get 
     { 
      return (GroupConfigurationElementCollection)base["scripts"] ?? new GroupConfigurationElementCollection(); 
     } 
    } 
} 

Является ли эта конфигурация возможно? Если да, то что я делаю неправильно?

Я получаю это сообщение об ошибке, когда пытаюсь получить раздел с менеджером конфигурации.

Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Unrecognized element 'asset'.

Source Error:

Line 96: Line 97: Line 98: Line 99: Line 100:

Source File: D:\ASP.NET Projects\Resource-Compiler\ResourceCompiler\Examples\web.config Line: 98

+1

Вы должны увидеть и использовать ** [Cassete] (http://getcassette.net/) ** вместо того, чтобы что-то делать с нуля ... плюс, он поддерживает гораздо больше , попробуйте! – balexandre

ответ

0

Я смог заставить его работать. Мне пришлось добавить две новые коллекции для узла stylesSheet и узла сценария. Вот мой полный код:

0

Как я вижу, вы пытаетесь вставить пользовательский раздел в "стандартный" файл web.config. В этом случае, вам необходимо зарегистрировать свой пользовательский раздел в

<configSections> 

и добавить соответствующий раздел там. Например (это некоторые Кварц конфигурации в одном из моих проектов):

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 

     <sectionGroup name="common"> 
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" /> 
     </sectionGroup> 
     ... other sections here... 
    </configSections> 
    ... other web.config stuff here 

, а затем, где-то ниже вы должны добавить свой собственный раздел, как это:

<common> 
    <logging> 
     <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net"> 
      <arg key="configType" value="INLINE" /> 
     </factoryAdapter> 
    </logging> 
</common> 

Вот статья MSDN об этом тема: http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

0

Это должно быть, но для каждого актива требуется тег имени, так как он является обязательным атрибутом для каждого актива. Если вам это не понадобится, тогда удалите IsRequired = true и IsKey = true. ConfigurationElementCollection действительно предъявляет строгие требования, как ваши данные формируются в App.Config. Система Sytem.Configuration позволяет наследовать значения из родительского файла app.config. Это даже работает для коллекций объектов. Чтобы заставить его работать, дизайнер MS представил специальные теги.

Чтобы удалить все элементы из коллекции, загруженной из родительского app.config, был добавлен тег <clear/> .

Чтобы добавить элемент, вам нужен тег <add/>, где данные серализованы в свойствах. Ваш app.config должен выглядеть следующим

<add asset source="~/Script/file1.css"/> 

Для поддержки наследования конфигурации вы платите цену довольно заперт в формате serializaton вы должны придерживаться. Конечно, вы можете расширить систему и добавить своего собственного поставщика конфигурации, который делает это по-другому, но это непростая задача. По крайней мере, намного сложнее, чем использовать настоящий сериализатор, такой как XmlSerializer, где у вас больше свободы в отношении формата данных.

DataContractSerializer также хорош, но он не позволяет вам контролировать все. XmlSerializer по-прежнему является самым быстрым и универсальным сериализатором для xml-файлов.

Смежные вопросы