2013-12-22 96 views
1

我有一個從接口派生的對象。我想使用顯示模板和編輯器模板。顯示模板工作得很好。但編輯器模板不能很好地工作。它不理解它說「不能創建一個接口的實例」。 我有一個自定義模型活頁夾。但它確實是虛擬的。接口模型綁定 - MVC 4

 protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext, Type modelType) 
    {   
     if (modelType.Equals(typeof(IExample))) 
     { 
      Type instantiationType = typeof(ExampleType1); 
      var obj = Activator.CreateInstance(instantiationType); 
      bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, instantiationType); 
      bindingContext.ModelMetadata.Model = obj; 
      return obj; 
     } 

     return base.CreateModel(controllerContext, bindingContext, modelType); 
    } 

我該如何爲每個從IExample派生的類做到這一點?有任何想法嗎?


[HttpGet] 
    public ActionResult Index() 
    { 
     MyModel model = new MyModel(); 

     model.inter = new ExampleType1(); 

     model.inter.number = 50; 

     return View(model); 
    } 

    [HttpPost]   
    public ActionResult Index(MyModel model) 
    { 
      //*-*-* I want to get it here. 

     return View(); 
    } 

public class MyModel 
{ 

    public IExample inter { get; set; } 

} 


public interface IExample 
{ 
    int number { get; set; } 
} 

public class ExampleType1 : IExample 
{ 
    public int number { get; set; } 
    public string tip1 { get; set; } 
} 
public class ExampleType2 : IExample 
{ 
    public int number { get; set; } 
    public string tip2 { get; set; } 
} 
+0

你說的意思是什麼? 「我怎麼能做到這一點從的​​IExample任何想法派生的每個類?」。另外,我認爲moel binder的部分是錯誤的。應該是:bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null,modelType); – Botis

+0

我只爲ExampleType1創建了實例。 類型instantiationType = typeof(ExampleType1);在我的索引操作中,我說IExample是ExampleType1的類型。但我可以說它是ExampleType2。 我也想爲ExampleType2創建一個實例。但我想要做到這一點。我可以從IExample派生更多的類。 – user3127359

+0

類似的問題在這裏:http://stackoverflow.com/questions/8276627/how-can-i-build-a-custom-model-binder-which-will-return-different-types-of-model。但是我同意Botis的說法,可能有更好的方法。 –

回答

1

沒有糾纏於你之所以需要這個(我認爲這是一個不好的設計,具有界面爲控制器方法的參數)。我認爲最簡單的解決方案是用字符串屬性ImplementedType擴展IExample接口。

public interface IExample 
{ 
    string type {get;} 
    int number { get; set; } 
} 

實現:

public class ExampleType1 : IExample 
{ 
    public string type 
    { get { return "ExampleType1"; } } 
    public int number { get; set; } 
    public string tip1 { get; set; } 
} 

和型號粘結劑:

var type = (string)bindingContext.ValueProvider.GetValue("type"); 
if (type == "ExampleType1") 
{ 
    //create new instance of exampletype1. 
} 
+0

我試過了。但是bindingContext.ValueProvider.GetValue(「type」)返回null。 – user3127359

+0

您應該嘗試檢查客戶端/服務器之間的消息(您可以使用chrome開發人員工具)並檢查「type」屬性是否實際發送到服務器。如果沒有,您可能需要將它添加到您的表單或實際將數據發佈到服務器的任何地方。 – Botis

+0

我添加了查看變量'type'。然後當我提交時,我用bindingContext.ValueProvider.GetValue(「inter.type」); (在MyModel中我的屬性名稱之間)。 ValueProviderResult type = bindingContext.ValueProvider.GetValue(「inter.type」); if(type.AttemptedValue ==「ExampleType1」){} 。也許我可以在視圖中創建不可見的「類型」變量。但它不是乾淨的解決方案。 – user3127359