2013-08-03 177 views
4

這是我的自定義模型綁定器,用於實例化派生類。自定義多態模型綁定器不綁定派生類型的屬性

public class LocationModalBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, 
     Type modelType) 
    { 
     var type = bindingContext.ModelName + "." + "type"; 

     Type typeToInstantiate; 

     switch ((string) bindingContext.ValueProvider.GetValue(type).RawValue) 
     { 
      case "store": 
      { 
       typeToInstantiate = typeof (Store); 
       break; 
      } 
      case "billing": 
      { 
       typeToInstantiate = typeof(LocationReference); 
       break; 
      } 
      case "alternate": 
      { 
       typeToInstantiate = typeof(Address); 
       break; 
      } 
      default: 
      { 
       throw new Exception("Unknown location identifier."); 
      } 
     } 

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

問題是它沒有綁定子類型的屬性。只有基礎類型Location上的屬性。爲什麼是這樣?

回答

1

我認爲調用return base.CreateModel是好的,你已嘗試。

我解決它通過添加return base.CreateModel行之前執行以下操作:

bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeToInstantiate); 
0

這篇從這裏... https://stackoverflow.com/a/9428558/221683

我不明白有多少這種類型的模型粘結劑的例子沒有這些分配工作過。

public class LocationModalBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, 
     Type modelType) 
    { 
     var type = bindingContext.ModelName + "." + "type"; 

     Type typeToInstantiate; 

     switch ((string) bindingContext.ValueProvider.GetValue(type).RawValue) 
     { 
      case "store": 
      { 
       typeToInstantiate = typeof (Store); 
       break; 
      } 
      case "billing": 
      { 
       typeToInstantiate = typeof(LocationReference); 
       break; 
      } 
      case "alternate": 
      { 
       typeToInstantiate = typeof(Address); 
       break; 
      } 
      default: 
      { 
       throw new Exception("Unknown location identifier."); 
      } 
     } 

     var model = Activator.CreateInstance(typeToInstantiate); 

     bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeToInstantiate); 
     bindingContext.ModelMetadata.Model = model; 

     return model; 
    } 
}