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