拥有以下型号:
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列表?
谢谢!
答案 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的辅助对象创建实例。