C# ASP.NET MVC 2填充视图模型数据

C# ASP.NET MVC 2填充视图模型数据,c#,asp.net-mvc,C#,Asp.net Mvc,切中要害:如何将词典映射到ViewModel?ViewModel包含与字典键同名的属性 为了提供更多信息,程序读取数据库记录并返回字典中记录的所有值。我只想向用户显示这些字段中的20-30个,而其他处理在幕后与其他字段一起进行。我已经创建了一个ViewModel并强键入了视图。我可以手动将字典中的属性分配给ViewModel属性,但是这似乎是填充ViewModel的错误方法 然后,我尝试使用反射填充字段,但这似乎是错误的方法 foreach (PropertyInfo propertyInfo

切中要害:如何将
词典
映射到ViewModel?ViewModel包含与字典键同名的属性

为了提供更多信息,程序读取数据库记录并返回
字典中记录的所有值。我只想向用户显示这些字段中的20-30个,而其他处理在幕后与其他字段一起进行。我已经创建了一个ViewModel并强键入了视图。我可以手动将
字典中的属性分配给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,其中键值与ViewModel属性值同名?

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

如果您一直使用
词典
,那么您有三个选择:

  • 反思——你已经做到了,这很直接

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

  • 动态
    /
    扩展对象
    。这在某种程度上是实验性的,涉及到围绕动态对象的强类型包装器


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

    如果您一直使用
    词典
    ,那么您有三个选择:

  • 反思——你已经做到了,这很直接

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

  • 动态
    /
    扩展对象
    。这在某种程度上是实验性的,涉及到围绕动态对象的强类型包装器


  • ViewPage正常,但ViewPage将导致访问错误,因为动态变量中的所有属性都是内部属性,无法在视图中访问。在这两种情况下,视图都从ViewPage继承,这应该可以。视图将始终使用强类型模型,调用动态对象的是属性的实现,而不是视图。+1用于详细说明ExpandooObject。我不能说它在这里是否最合适,但我很高兴在示例中使用了它,这样更多的人就知道了.NET 4.0的功能。我没有立即回复,因为我正试图围绕您提到的ExpandoObject进行思考。使用这些属性直接从字典中读取非常简单。我认为这实际上可以满足我的需要。ViewPage可以,但ViewPage会导致访问错误,因为动态变量中的所有属性都是内部的,无法在视图中访问。在这两种情况下,视图都从ViewPage继承,这应该可以。视图将始终使用强类型模型,调用动态对象的是属性的实现,而不是视图。+1用于详细说明ExpandooObject。我不能说它在这里是否最合适,但我很高兴在示例中使用了它,这样更多的人就知道了.NET 4.0的功能。我没有立即回复,因为我正试图围绕您提到的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;
    }