2010-07-09 66 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

相關問題