2015-11-11 2 views
0

Я унаследовал проект и не могу поговорить с/не знаю оригинального разработчика, чтобы задать этот вопрос. Это проект .NET MVC.ExpandoObject не заполняется всеми значениями

Это первый раз, когда я работал с ExpandoObject, поэтому я стараюсь учиться. Я следую стилю, который изначально использовался, когда информация была добавлена ​​в xml-файл, а затем анализировалась и хранилась в Model. Когда я отлаживаю проблему и проверяю Model в представлении, я вижу только одно значение двух, которые у меня есть в XML.

Вот XML, что я appened до конца файла:

<Home_Index> <NewsletterSignup> 
    <SignUpMessage> 
     <Copy> 
     <![CDATA[ 
      Want up to $20 in savings?  
     ]]> 
     </Copy> 
    </SignUpMessage> 
    <SignUpMessage> 
     <Copy> 
     <![CDATA[ 
      Sign up, stay connected &amp; save up to $20.  
     ]]> 
     </Copy> 
    </SignUpMessage> 
    </NewsletterSignup> 
</Home_Index> 

Так что, когда я проверить Model, все, что я вижу, это второй <SignUpMessage>, но не первым.

Вот код, который создает ExpandoObject:

public class XmlToDynamic 
{ 
    public static dynamic Parse(String file, XElement node = null) 
    { 
     if (String.IsNullOrWhiteSpace(file) && node == null) return null; 

     node = !String.IsNullOrWhiteSpace(file) ? XDocument.Load(System.Web.Hosting.HostingEnvironment.MapPath(file)).Root : node; 

     IDictionary<String, dynamic> result = new ExpandoObject(); 

     var pluralizationService = PluralizationService.CreateService(CultureInfo.CreateSpecificCulture("en-us")); 

     node.Elements().ForEach(gn => 
     { 
      var isCollection = gn.HasElements && 
       (
        gn.Elements().Count() > 1 && 
        gn.Elements().All(e => e.Name.LocalName.ToLower() == gn.Elements().First().Name.LocalName) || 
         gn.Name.LocalName.ToLower() == pluralizationService.Pluralize(gn.Elements().First().Name.LocalName).ToLower() 
       ); 

      var items = isCollection ? gn.Elements().ToList() : new List<XElement> { gn }; 

      var values = new List<dynamic>(); 

      items.ForEach(i => values.Add((i.HasElements) ? Parse(null, i) : i.Value.Trim())); 

      result[gn.Name.LocalName] = isCollection ? values : values.FirstOrDefault(); 
     }); 

     return result; 
    } 
} 

То, что я хочу сделать, это выбрать два <SignUpMessage> и случайным образом выбрал один для отображения.

Также стоит отметить, что в файле xml есть контент, который правильно разобран до того, как я добавил <NewsletterSignup>.

ответ

1

Я считаю, что вам нужен родительский элемент для хранения ваших двух SignUpMessages:

<Home_Index> 
    <NewsletterSignup> 
    <SignUpMessages> 
     <SignUpMessage> 
     <Copy> 
      `<![CDATA[` 
      Want up to $20 in savings?  
      `]]>` 
     </Copy> 
     </SignUpMessage> 
     <SignUpMessage> 
     <Copy> 
      `<![CDATA[` 
      Sign up, stay connected &amp; save up to $20.  
      `]]>` 
     </Copy> 
     </SignUpMessage> 
    </SignUpMessages> 
    </Home_Index> 
</NewsletterSignup> 

незамкнутой теги для Home_Index и NewsletterSignup также является причиной для беспокойства, так что я закрыл их.

+0

Спасибо, но в моем 'xml' файле они закрыты. Я не уверен, почему, когда я скопировал их на почту, их обрезали. – DFord

+0

Хорошо, не беспокойтесь. Главное - добавить родительский элемент , как я уже говорил в вышеприведенном фрагменте. Это даст вам коллекцию из двух объектов , которые, я надеюсь, вам нужны. – Phil

+0

в моем отредактированном xml, '' должен выступать в роли родителя для '', правильно? Или есть что-то еще, что мне не хватает? – DFord