1

我已经看过这篇关于如何创建模型绑定器提供程序来支持接口的博客文章。

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; }
4

1 回答 1

0

如果我解决了您的问题,您的解决方案可能是使用像 Ninject 这样的依赖注入/控制反转框架还有很多 其他 。根据框架,您可以配置从接口到具体类的映射。

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

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

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

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

一切都会自动运行。

于 2013-03-21T14:07:03.590 回答