代码之家  ›  专栏  ›  技术社区  ›  Neil Outler

ASP.NET MVC 2填充ViewModel数据

  •  1
  • Neil Outler  · 技术社区  · 16 年前

    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);
            }
        }
    }
    

    那么,有没有一种方法可以使用 词典<字符串,字符串> 其中键值与ViewModel属性值的名称相同?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Igor Zevaka    16 年前

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

    如果你被困住了 Dictionary<string,string> 那么你有三个选择:

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

    2. dynamic / ExpandoObject . 这有点实验性,需要在动态对象周围使用强类型包装器。

    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;
    }
    

    动态 并让属性直接进入字典:

    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;
    }