1

インターフェイスをサポートするモデル バインダー プロバイダーを作成する方法に関するこのブログ投稿を見ました。

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

しかし、実際のModel Binderをどう扱えばいいのか途方に暮れています。

を継承できることはわかって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 に答える