ExpandoObject未填充所有值

时间:2015-11-11 18:59:56

标签: c# .net xml asp.net-mvc expandoobject

我继承了一个项目,无法与/或不知道原始开发人员提出这个问题。这是一个.NET MVC项目。

这是我第一次使用ExpandoObject,所以我正在努力学习。我遵循最初使用的样式,其中信息被添加到xml文件,然后解析并存储在Model中。当我调试问题并检查视图中的Model时,我只看到我在XML中拥有的两个值。

这是我在文件末尾附加的XML:

    <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>,而不是第一个。{/ p>

以下是创建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 个答案:

答案 0 :(得分: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的未闭合标签也引起关注,因此我已将其关闭。