接口模型绑定在post - generic list成员上

时间:2014-04-29 06:53:43

标签: c# asp.net-mvc

拥有以下型号:

public class SomeModelAttribute<T> : ISomeModel {
   public string Name { get; set; }
   public T Value { get; set; }
}

public class SomeModel {
   public IEnumerable<ISomeModel> Attributes { get; set; }
}

当我向public JsonResult SaveModel(SomeModel model){ ... }发帖请求时,我收到以下异常:Cannot create an instance of an interface.

获得此错误是常识,但有没有办法让这个工作类似于模型绑定器如何从IEnumerable创建一个List?这样我就可以在SomeModel内部发布一个SomeModelAttribute列表?

谢谢!

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案:自定义模型绑定器。 按如下方式创建自定义模型绑定器:

public class SomeModelModelBinder : DefaultModelBinder
{
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
     {
         if (bindingContext.ModelType == typeof(ISomeModel))
         {
             HttpRequestBase request = controllerContext.HttpContext.Request;
             bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Value");

             [some logic to return a new SomeModelAttribute<something>();]
         }
         else
         {
             return base.BindModel(controllerContext, bindingContext);
         }
     }
}

在ISomeModel上添加了ModelBinder属性,以便我们指定必须使用的自定义绑定器:

[ModelBinder(typeof(SomeModelModelBinder))]
public interface ISomeModel { ... }

Et瞧...就像魅​​力一样:)

答案 1 :(得分:0)

模型绑定尝试在绑定之前创建实例。我们无法从接口使用实现ISomeModel的辅助对象创建实例。