2011-11-09 47 views
1

我所擁有的是一個模型,它具有動態屬性之一。這個動態屬性擁有大約50個不同的對象之一。這個模型被髮送到一個視圖,動態創建基於哪個對象被使用的頁面。這是完美的工作......問題是回發。當模型發回時,模型綁定器無法綁定動態屬性。我期待這一點,並認爲我將能夠處理它,但沒有任何我嘗試過適用於爲每個不同的對象做出行動。發佈動態屬性後(模型綁定)

型號

public class VM_List 
{ 
    public Config.CIType CIType { get; set; } 
    public dynamic SearchData { get; set; } 
    //Lots of static fields 
} 

這工作

public ActionResult List_Person(VM_List Model, VM_Person_List SearchData) 
{ 
Model.SearchData = SearchData; 
//Stuff 
} 

public ActionResult List_Car(VM_List Model, VM_Car_List SearchData) 
{ 
Model.SearchData = SearchData; 
//Stuff 
} 

但我要的是一個單一的動作

public ActionResult List(VM_List Model) 
{ 
    //Stuff 
} 

我試圖像

public ActionResult List(VM_List Model) 
{ 

     switch (Model.CIType) 
     { 
      case Config.CIType.Person: 
       UpdateModel((VM_Person_List)Model.SearchData); 
       break; 
      default: 
       SearchData = null; 
       break; 
     } 

    //Stuff 
} 
東西210

和自定義模型綁定器

CIType CIType = (CIType)bindingContext.ValueProvider.GetValue("CIType").ConvertTo(typeof(CIType)); 

switch (CIType) 
{ 
      case Config.CIType.Person: 
       SearchData = (VM_Person_List)bindingContext.ValueProvider.GetValue("SearchData").ConvertTo(typeof(VM_Person_List)); 
       break; 
      default: 
       SearchData = null; 
       break; 
     } 

,但我不能讓任何工作。有任何想法嗎?

+0

當您使用CIType你怎麼會在你的第三或第四個例子定義它你不應該定義構造函數它是模型的一部分,就像你在例子1或2中做的那樣? –

+0

我錯過了「模特」。當我簡化代碼時。添加它。 –

+0

你可以讓SearchData字段是通用的而不是動態的嗎?或者可能使用接口?必須考慮50個具體的類實現是一種嚴重的代碼異味 – Jason

回答

0

在嘗試了很多不同的事情之後,我終於找到了一種可行的方法。

操作:

public ActionResult List(VM_List Model) 
{ 

//If the defaultmodelbinder fails SearchData will be an object 
if(Model.SearchData.GetType() == typeof(object)) 
{ 

//Get SearchData as a Dictionary 
Dictionary<string, string> DSearchData = Request.QueryString.AllKeys.Where(k => k.StartsWith("SearchData.")).ToDictionary(k => k.Substring(11), k => Request.QueryString[k]); 

switch (Model.CIType) 
{ 
       case Config.CIType.Person: 
        Model.SearchData = new VM_Person_List(DSearchData); 
        break; 
       case Config.CIType.Car: 
        Model.SearchData = new VM_Car_List(DSearchData); 
        break; 
} 

//Rest of action 
//.. 
     } 

,併爲每個對象做一個接受字典

public VM_Car_List(Dictionary<string, string> DSearchData) 
{ 
    this.Make = Convert.ToInt32(DSearchData["Make"]); 
    this.Model = Convert.ToInt32(DSearchData["Model"]); 
    this.Year = Convert.ToInt32(DSearchData["Year"]); 
    // ETC 
}