ASP.NET MVC 2填充了ViewModel数据

时间:2010-07-09 05:40:59

标签: c# asp.net-mvc

关键点:如何将Dictionary<String, String>映射到ViewModel? ViewModel包含与Dictionary键相同名称的属性。

为了提供更多信息,程序将读取数据库记录并返回Dictionary<String, String>中记录的所有值。我只想向用户显示20-30个这些字段,而其他处理在其他字段的幕后发生。我制作了一个ViewModel并强烈输入了视图。我可以手动将Dictionary<String, String>中的属性分配给ViewModel属性,但这似乎是填充ViewModel的错误方法。

然后我尝试使用反射来填充字段,但这似乎是错误的方法。

foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
{
    if (propertyInfo.PropertyType.Name.Equals("String"))
    {
        if (myClass.FieldValues.Keys.Contains(propertyInfo.Name))
        {
            propertyInfo.SetValue(this, myClass.FieldValues[propertyInfo.Name], null);
        }
    }
}

那么,有没有一种方法可以使用Dictionary<String, String>填充我的ViewModel,其中Key值与ViewModel属性值的名称相同?

1 个答案:

答案 0 :(得分:1)

如果我是,我正在考虑设置一个ORM层(实体,Linq-to-Sql)来返回强类型对象。这为您提供了更安全的整体解决方案。

如果您遇到Dictionary<string,string>,那么您有三种选择:

  1. 反思 - 你已经做到了,这很直接。

  2. 表达式/反射。您可以编译一个转换为lambda的表达式,然后简单地将其作为方法调用。这有利于在运行时比反射更快。但是,除非您每秒进行数千次这样的操作,否则获得的性能不值得付出额外的努力。

  3. dynamic / ExpandoObject。这有点实验性,并且涉及围绕动态对象的强类型包装。

  4. public class ViewModel {
      ExpandoObject m_Dynamic;
    
      public string FirstName {return m_Dynamic.FirstName ; }
      public string LastName {return m_Dynamic.LastName; }
    
      public ExpandoObject DynamicObject {get{return m_Dynamic;}}
    }
    
    // In the data mapping layer
    ViewModel vm = new ViewModel();
    Dictionary<string,string> data = new Dictionary<string,string>{{"FirstName", "Igor"}, {"LastName", "Zevaka"}};
    foreach(var kv in data) {
      ((IDictionary<string,object>)vm.DynamicObject)[kv.Key] = kv.Value;
    }
    

    哎呀,你甚至不能打扰dynamic并让财产直接进入字典:

    public class ViewModel {
      Dictionary<string,string> m_Dynamic;
    
      public string FirstName {return m_Dynamic["FirstName"]; }
      public string LastName {return m_Dynamic["LastName"]; }
    
      public Dictionary<string,string> DynamicObject {get {return m_Dynamic;}}
    }
    
    // In the data mapping layer
    ViewModel vm = new ViewModel();
    Dictionary<string,string> data = new Dictionary<string,string>{{"FirstName", "Igor"}, {"LastName", "Zevaka"}};
    foreach(var kv in data) {
      vm.DynamicObject[kv.Key] = kv.Value;
    }