2010-04-15 74 views
2

我有一個場景,我需要綁定到一個接口 - 爲了創建正確的類型,我有一個自定義模型聯編程序,知道如何創建正確的具體類型這可以不同)。ModelBinders,複雜的嵌套類型和接口

但是,創建的類型從來沒有正確填充字段。我知道我錯過了一些非常簡單的東西,但是誰能告訴我爲什麼或者至少需要爲模型聯編程序進行操作工作和綁定屬性?

public class ProductModelBinder : DefaultModelBinder 
{ 
    override public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType == typeof (IProduct)) 
     { 
      var content = GetProduct (bindingContext); 

      return content; 
     } 

     var result = base.BindModel (controllerContext, bindingContext); 

     return result; 
    } 

    IProduct GetProduct (ModelBindingContext bindingContext) 
    { 
     var idProvider = bindingContext.ValueProvider.GetValue ("Id"); 
     var id = (Guid)idProvider.ConvertTo (typeof (Guid)); 

     var repository = RepositoryFactory.GetRepository<IProductRepository>(); 
     var product = repository.Get (id); 

     return product; 
    } 
} 

在我的情況下,模型是一個複雜類型,有一個IProduct財產,這是那些我需要填寫值

型號:

[ProductBinder] 
public class Edit : IProductModel 
{ 
    public Guid Id { get; set; } 
    public byte[] Version { get; set; } 

    public IProduct Product { get; set; } 
} 

回答

0

ModelBinder的工作遞歸等什麼你需要做的是實現一個自定義模型聯編程序,在其中覆蓋方法onCreate和BindModel。

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
{ 
// get actual type of a model you want to create here 
    return Activator.CreateInstance(type); 
} 

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    // here our CreateModel method will be called 
    var model = base.BindModel(controllerContext, bindingContext); 
    // we will get actual metadata for type we created in the previous line 
    var metadataForItem = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()); 
    // and then we need to create another binding context and start model binding once again for created object 
    var newModelBindingContext = new ModelBindingContext 
     { 
      ModelName = bindingContext.ModelName, 
      ModelMetadata = metadataForItem, 
      ModelState = bindingContext.ModelState, 
      PropertyFilter = bindingContext.PropertyFilter, 
      ValueProvider = bindingContext.ValueProvider 
     }; 
     return base.BindModel(controllerContext, newModelBindingContext); 

}

希望有所幫助。