Spring.NETとModelBinderとASP.NET MVC
-
29-08-2019 - |
質問
私は、ASP.NET MVCでSpring.NET IoCの機能を利用したデモに取り組んでいます。それは一種のwww.asp.netサイト上でペアプログラミングビデオチュートリアルに提示MyBlogアプリケーションのようなものです。私はMicrosoftのユニティフレームワークを使用して同じデモを完了し、現在は春のコンテナを試してみたいきました。 そのために私が最初にそのように春のオブジェクトファクトリを作成し、簡単なIControllerFactoryを実装しました。
IObjectFactory factory;
(....)
factory = new XmlObjectFactory(new FileSystemResource(application.Server.MapPath("objects.xml")))
と次のそのようなその工場からコントローラを取得します:
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) {
IController result = context.GetObject(controllerName) as IController;
return result;
}
(単純化のために取り除かエラー処理)。
今どこかにHomeControllerに、私はアクションのこの種を持っています:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddEntry([Bind] BlogEntry entry, int id) {
entry.EntryDate = DateTime.Now;
....
そして、ここでエントリパラメータ(実際には基本的なもの)のためのエディタを定義AddEntry.aspxビューの一部です:
<form method="post" action="/Home/AddEntry/<%= ViewData["id"] %>">
<table>
<tr>
<td><label for="Title">Title</label></td>
<td><input name="entry.Title" type="text"/></td>
</tr>
<tr>
<td><label for="Text">Content</label></td>
<td><input name="entry.Text" type="text"/></td>
</tr>
</table>
<br />
<input type="submit" value="Add entry" />
<input type="button" value="Cancel" onclick="history.back(-1);" />
</form>
今ここで契約です: 私はユニティのIoCを使用しているとき、それは魔法のように動作します。それが必要とライン
のように「エントリ」パラメータは、私のフォームからデシリアライズされますentry.EntryDate = DateTime.Now;
問題なく完了します。
しかし、私は物事がナットを行くを開始(上記のような)Spring.NETオブジェクトファクトリに切り替えたとき。例外がスローされるように、まず、パラメータ「エントリ」のヌルになります。 私の最後の問題の可能性を追跡するために、私はそのように見えるカスタムIModelBinderの並べ替えを実装しました。
public class BlogEntryBinder : IModelBinder {
public ModelBinderResult BindModel(ModelBindingContext bindingContext) {
ModelBinderResult result = ModelBinders.DefaultBinder.BindModel(bindingContext);
return result;
}
}
私はユニティフレームワークを使用してここに来てのHttpRequestへのBindingContextからドリルダウンすると私はRequest.HttpMethodが「POST」とのRequest.Formが適切に満たされていることがわかります。私は方法があるSpring.NETを使用して同じことを行う場合は、「GET」とのRequest.Formは空です。 しかし、私は私のコントローラのアクション(AddEntry)へのステップと私はRequest.HttpMethodとのRequest.Formが彼らの適切な値を持っていることがわかり、両方の状況でリクエストにドリルダウンするときます。
今の質問は、それだけでユニティフレームワークを使用して1と同じように動作するように私はSpring.NETとバージョンを固定しない方法です?
解決
私は答えを見つけた!
私のオブジェクト定義は、そのように見えました
<!-- Controlers -->
<object name="Home" type="MyBlog.Controllers.HomeController">
<property name="BlogService" ref="BlogService" />
<property name="BlogEntryService" ref="BlogEntryService" />
<property name="BlogEntryCommentService" ref="BlogEntryCommentService" />
</object>
ネヴァーマインドの特性は、それが実際には同じインスタンスに私が使用してこのオブジェクトを頼むたびに返している何に設定されている。
IController result = context.GetObject(controllerName) as IController;
だから私は
に定義を変更したとき<!-- Controlers -->
<object name="Home" type="MyBlog.Controllers.HomeController" singleton="false">
<property name="BlogService" ref="BlogService" />
<property name="BlogEntryService" ref="BlogEntryService" />
<property name="BlogEntryCommentService" ref="BlogEntryCommentService" />
</object>
すべてが仕事がうまく始まっています。
敬具、 マティアスます。
他のヒント
この振る舞いを明確にするためだけの追加の注記:コントローラはシングルトンモードにASP.NET MVCフレームワークによってプロトタイプが、春のデフォルト値として扱われます。したがって、明示的にコンテナ設定で非シングルトンとしてあなたのオブジェクトをマークする必要があります。今後のSpring MVCの統合モジュールは、このの世話をしますので、あなたは、このに実行されません。
HTH、 エーリッヒ