2013-05-11 93 views
1

我有一個稍長的概念問題,我想知道是否有人可以幫助我。.Net MVC綁定動態類型到運行時的模型

在MVC中,我建立了一個使用kendoui's framework構建網格的網站。

我網站上的所有網格的構造完全相同,除了他們使用的模型和需要爲每個模型實施的CRUD方法。我設置了每個模型實現瞭如下所示的CRUD方法的接口,以便將邏輯全部集中在一個地方。

//Actual interface has variables getting passed 
public interface IKendoModelInterface 
{ 
    void Save(); 
    void Read(); 
    void Delete(); 
} 

public class Model1: IKendoModelInterface 
{ 

    [Key] 
    public int IdProperty1 { get; set; } 

    public int SomeProperty2 { get; set; } 

    public string SomeProperty3 { get; set; } 

    public void Save(){ 
     //Implement Save 
    } 

    public void Read(){ 
     //Implement Read 
    } 

    public void Delete(){ 
     //Implement Delete 
    } 
} 

然後加快所有獲得電網工作,我創建了一個抽象的控制器,可以調用被傳遞到它的型號的接口方法所需的腳手架操作方法的寫作。

//Implement the AJAX methods called by the grid 
    public abstract class KendoGridImplController<T> : Controller where T : class, IKendoModelInterface 
{ 
    // Method called from kendo grid 
    public virtual ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<T> createdRecords) 
    { 
     //Invoke Create Method for Model and return results 
    } 

    public virtual ActionResult Read([DataSourceRequest]DataSourceRequest request, int Id) 
    { 
     //Invoke read method for model and return results 
    } 
    //Update and Delete also implemented.. 

} 

然後,我只需要一個控制器,每個模型,實現上面的抽象控制器傳遞正在使用的模型類型。

 public class ResponsibilityMatrixController : KendoGridImplController<Model1> 
{ 
    //Set up the page the grid will be on 
    public ActionResult Index(int id) 
    { 

     return View("SharedGridView", id); 
    } 
    //Can override abstract methods if needed but usually won't need to 
} 

我想知道如果我可以進一步邁進這一步,或者我已經走到了路的盡頭。對我來說,如果我必須爲每個模型創建一個控制器,而這個控制器看起來像是更多的重複代碼,它只會將類型傳遞給抽象控制器並調用相同的View。

昨天我試了很長時間才弄清楚我是否可以動態地將類型賦值給抽象控制器。我設置了通過字符串發回模型類型的東西,我仍然可以調用所需的方法。在失敗的情況下,映射不能在默認情況下在任何控制器操作上完成,因爲在編譯時該類型是未知的。例如

public virtual ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<T> createdRecords) 

createdRecords不能綁定這樣,如果這是在通過T是一個接口,而不是模式本身,我發現沒有真正的方法將表單數據映射到一個ISN類型的實例在編譯時不知道。

我想知道是否有一種簡單的方法來做這種映射之間的對映類型的實例獲得傳遞,我可以在運行時弄清楚,如果有一些其他方式來設置,我俯瞰或者如果這兩件事情都會變得太多,我就不應該嘗試像這樣的事情,並像我現在這樣爲每個模型構建一個控制器?

回答

0

如果有人發現這在未來這是我迄今爲止所做的解決我的問題。首先,我下載了impromptu-interface代碼庫,這在處理動態類型時非常有用。

然後,對於抽象控制器的保存方法,重要的是我可以綁定回原始對象類型,我這樣做了。

// Method called from kendo grid 
public virtual ActionResult Create([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<ExpandoObject> createdRecords) 
{ 
    Type originalGridType = GetTypeOfModelUsingCustomCodeIDevelopedEarlier(); 
    foreach (ExpandoObject record in createdRecords) 
    { 
     var convertedType = Impromptu.InvokeConvert(record, originalGridType); 
     T objectInstance = Impromptu.ActLike(convertedType); 
     objectInstance.Save(); 
    } 

} 

然後我只需要在模型中添加一個可以從ExpandoObject轉換到我的模型的強制轉換。一個額外的方法,我仍然希望不必在那裏,但有一些幫助者方法,我寫了它沒有太多的代碼來實現。

public static implicit operator Model1(ExpandoObject expando) 
    { 
     Model1 model = new Model1(); 
     //Set fields of model... 
     //.... 
     return model; 
    } 

從這裏一切工作正面到背面。也許有更好的辦法,但這是迄今爲止我能想到的最好的方式。

+0

可以請給我整個例子,所以可以從中做出一些東西......通過查看thia bastract內容無法弄清楚我們正在談論什麼.....在此先感謝。 – user1220402 2014-01-02 06:32:41