模型绑定MVC4中的接口

时间:2013-03-21 13:26:51

标签: c# asp.net-mvc model-binding

我已经看过这篇博客文章,介绍如何创建模型绑定程序提供程序以支持接口。

http://www.matthidinger.com/archive/2011/08/16/An-inheritance-aware-ModelBinderProvider-in-MVC-3.aspx

但是我对如何处理实际的模型活页夹感到茫然。

我知道我可以继承DefaultModelBinder,但是如何在自定义模型绑定器中找出相关的具体类,你是否在CreateModel函数中执行此操作?如果是这样,你怎么做?

我的界面和一些类的示例结构:

public interface IAnswerControlViewModel : IQuestionAnswerControl
{
...
}

public class AnswerControl<T> : IAnswerControlViewModel
{
..
}

public class AnswerCheckBox : AnswerControl<bool>
{

}

public class AnswerMultiLineText : AnswerControl<string>
{
    [DataType(DataType.MultilineText)]
    public override string Value { get; set; }
}

public class AnswerCheckBoxListModal: AnswerControl<AnswerMultiSelectListValueType>
{
    public string ModalName { get; set; }
}

这是我使用博客文章中的示例在我的Global.asax中获得的模型绑定:

ModelBinders.Binders.Add(typeof(IAnswerControlViewModel), new AnswerControlModelBinder());

var answerControlBinderProvider = new InheritanceAwareModelBinderProvider
{
    { typeof (IAnswerControlViewModel), new AnswerControlModelBinder() }
};
ModelBinderProviders.BinderProviders.Add(answerControlBinderProvider);

目标是让MVC知道如何在帖子到动作期间对此进行绑定:

public IList<IAnswerControlViewModel> AnswerControls { get; set; }

1 个答案:

答案 0 :(得分:1)

如果我的问题正确,那么您的解决方案可能是使用依赖注入/控制反转框架,如Ninject,但there are many {{ 3}}。根据框架,您可以配置从接口到具体类的映射。

然后,您所要做的就是使用以下命令解决具体类:

var concrete = IoCContainer.Resolve<IAnswerControlViewModel>();

或者如果类型存储在变量中:

var concrete = IoCContainer.Resolve(ModelBindingContext.ModelType);

一切都是自动化的。