2010-07-09 38 views
1

切中要害:我将如何映射到Dictionary<String, String>一个视图模型? ViewModel包含与Dictionary键名称相同的属性。ASP.NET MVC 2填充视图模型数据

为了提供更多的信息,程序读取数据库记录并返回所有值的一个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?

回答

1

如果我是你,我会看建立一个ORM层(实体,LINQ到SQL)强烈返回类型对象。这为您提供了更安全的整体解决方案。

如果你被卡住Dictionary<string,string>那么你有三种选择:

  1. 思考 - 你已经这样做了,这是非常简单的。

  2. 表达式/反思。您可以编译一个表达式,将其转换为lambda表达式,然后简单地称之为方法。这具有在运行时比反射更快的优点。但是,除非您每秒执行数千次这些操作,否则获得的性能不值得额外付出。

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

哎呀,你甚至可以不dynamic打扰,并有物业去字典dicrectly:

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

的ViewPage 是好的,但的ViewPage 会导致访问错误,因为动态变量中的所有属性都是内部的,无法在视图中访问。 – 2010-07-09 06:08:46

+0

在这两种情况下,视图都继承自ViewPage ,这应该很好。该视图将始终与强类型模型一起使用,它是调用动态对象的属性的实现,而不是视图。 – 2010-07-09 06:45:08

+0

用于详细说明ExpandoObject。我不能说这是否是最合适的,但我很高兴它在示例中使用,以便更多人了解.NET 4.0的功能。 – 2010-07-09 11:00:13

相关问题