問題タブ [custom-model-binder]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc - DateTime ローカリゼーション用のカスタム ModelBinder
最近 POST から GET に変更した ASP.NET MVC サイトにフォームがあります。ただし、これを行ったときに、関連するアクションの DateTime パラメーターが、POST の en-GB ではなく、GET の en-US という別のカルチャを効果的に使用していることに気付きました。つまり、基本的に日と月が入れ替わっています。
次の記事で、これが行われる理由を説明しましたが、送信前に POST に戻したり、JS を使用してフォームを変更したりせずに、それを克服する方法を見つける必要がありました。
http://xhalent.wordpress.com/2011/05/14/localization-of-dates-in-asp-net-mvc/ http://weblogs.asp.net/melvynharbour/archive/2008/11/21/ mvc-modelbinder-and-localization.aspx
理論を試すためだけに、DateTime のカスタム バインダーを作成しましたが、そうすることで問題が解決したようです。なぜこれが機能するのか誰でも説明できますか?
カスタム バインダーは、基本的に global.ascx.cs の次の行でした。
そしてこれは DateTimeModelBinder クラス用です
asp.net-mvc - カスタムモデルバインダーに依存関係を挿入し、Ninjectを使用してInRequestScopeを使用します
NInject.Web.MvcでNInjectを使用しています。
まず、同じWebリクエスト中に、インスタンスをIPostRepository
コントローラーとカスタムモデルバインダーの間で共有する簡単なテストプロジェクトを作成しました。私の実際のプロジェクトではIEntityChangeTracker
、同じオブジェクトグラフにアクセスする2つのリポジトリが効果的に存在するという問題が発生しているため、これが必要です。したがって、テストプロジェクトを単純にするために、ダミーのリポジトリを共有しようとしています。
私が抱えている問題は、それが最初のリクエストで機能することであり、それだけです。関連するコードは以下のとおりです。
NInjectModule:
CustomModelBinder:
Global.asax:
この方法で行うと、実際にIPostRepository
は、共有インスタンスではなく、の2つの別個のインスタンスが作成されます。モデルバインダーに依存関係を注入することに関して、私が見逃していることがここにあります。上記の私のコードは、 NInject.Web.Mvc wikiで説明されている最初のセットアップ方法に基づいていますが、両方を試しました。
2番目の方法を使用した場合、IPostRepository
最初のWebリクエストに対してのみ共有され、その後はデフォルトでインスタンスを共有しませんでした。ただし、それが機能するようになったときDependencyResolver
は、NInjectで同じことを行う方法を理解できなかったため(カーネルがNInjectMVC3クラスに隠れているため)、デフォルトを使用していました。私はそうしました:
これが初めて機能した理由は、これがNInjectを介して解決されていないためだと思います。したがって、ライフサイクルは実際にはMVCによって直接処理されています(ただし、依存関係をどのように解決しているかはわかりません)。
では、モデルバインダーを適切に登録し、NInjectに依存関係を注入させるにはどうすればよいですか?
asp.net-mvc - 変更後にDefaultModelBinderから継承したカスタムモデルバインダーでモデルを再検証するにはどうすればよいですか?
DefaultModelBinderから継承したカスタムモデルバインダーがあります。私がやりたいのは、DefaultModelBinderでは解決できないプロパティをモデルに設定することです。次のようになります。
ただし、IFooModelのBarプロパティをnullにすることはできず、FluentValidationを使用しているため、base.BindModelを呼び出した後、ModelStateは無効になります。
したがって、base.BindModelを呼び出すときにモデルを検証しないようにするか、少なくともエラーをクリアして、Barプロパティを設定した後でモデルを再検証したいと思います。
バリデーターを解決してモデルを検証しようとしましたが、実際に検証を実行することができないようで、エラーは発生しません(必要な場合でも)。
モデルを返す前にこれを実行した後、バリデーターにはFluentValidationModelValidatorが含まれていますが、validator.Validateを呼び出すと、エラーは発生しません。以前にbase.BindModelを実行したときにエラーが発生した別のプロパティがモデルにあるため、ここでも同じエラーが発生すると予想されます。
asp.net-mvc - 1つのカスタムモデルバインダーをCreateModelに、もう1つをBindModelに?
背景: MVCポストバックアクションメソッドで、ビューモデルではなくコマンドオブジェクトを受け取っています。これらのコマンドオブジェクト(トランザクションスクリプトとほぼ同じ)は、アクションメソッドに入るとセットアップされ、実行できるようになります。モデルバインダーには、実行プロセス中に使用されるパラメーターが設定されています。
物事をもう少し複雑にするために、私のコマンドオブジェクトには、それぞれのコンストラクターで必要な依存関係(サービス、リポジトリなど)があります。そのため、デフォルトのDependencyResolver(IoCコンテナーで既に設定されている)を使用してモデルオブジェクトを構築するカスタムモデルバインダーを作成する必要がありました。
Global.asax.cs
そして、そのように設定します:
繰り返しますが、これはすべて正常に機能し、依存関係がコンストラクターに注入されてから、デフォルトのモデルバインダーが引き継ぎ、通常どおりプロパティを設定します。
問題: 私が抱えている問題は、すべてのコマンドオブジェクトに「SessionId」GUIDパラメーター(Cookieから取得)があり、最初に行うことは、挿入されたサービスを使用してこのIDからセッションオブジェクトを解決しようとすることです。
この繰り返しを削除したかったので、リポジトリでこのルックアップを処理する2番目のモデルバインダーを作成しました。つまり、コマンドオブジェクトがSession
プロパティを直接持つことができます(セッションリポジトリのコンストラクター依存関係を削除します)。
私のGlobal.asax.cs
ファイルは今のように見えます:
SessionModelBinderを単独でテストしたので、動作することがわかりました。ただし、DependencyModelBinderと組み合わせて使用すると、呼び出されることはありません。モデルオブジェクトを構築するときにMVCにDependencyModelBinderを使用させるにはどうすればよいですか?しかし、それらにセッションプロパティをバインドするときにSessionModelBinderを使用させるにはどうすればよいですか?または、これに対するより良いアプローチを知っている人はいますか?
c# - How can I control the attempted value for a custom model binder?
I've got an action with a signature like this:
Which is implemented like this:
Basically, i'm binding a raw value to an enum, pretty simple. Works fine.
But, notice how in order to get access to the attempted value, i need to use a magic string ("myEnum").
Is there any way i can supply this to the model binder, so remove the magic string?
Because if i want to use this model binder in other places, then i have to make sure i call the parameter "myEnum", otherwise it will cause a runtime error.
I tried adding a ctor to the model binder, but there's nowhere where i actually instantiate it.
Any ideas?
asp.net-mvc - MVC アプリケーションで Postmark からの大規模な JSON 入力を処理するにはどうすればよいですか?
これはこの質問に関連していますが、この場合は私が返すものではなく、モデル バインディングです。Postmarkを使用して受信メールを処理しています。これは、 JSON ペイロードを持つページに投稿されます。
以下のようなモデルと、この JSON ペイロード (application/json で投稿) を取り込んで処理するアクションがあります。
これは小さな添付ファイルには問題なく機能しますが、デフォルトの maxJsonLength プロパティを超えると、逆シリアル化でエラーが発生します。(「JSON JavaScriptSerializer を使用したシリアル化または逆シリアル化中にエラーが発生しました。文字列の長さが maxJsonLength プロパティで設定された値を超えています。」) 画像の添付ファイルを受け入れたいので、これはほとんどの画像が失敗することを意味します。
web.config を更新しようとしましたが、他のスレッドによると、これは MVC コントローラーには役立ちません。カスタム IModelBinder で言及されていることはおそらくできると思いますが、逆シリアル化をインターセプトする方法に苦労しています。(つまり、デシリアライズが既に行われているため、まだ失敗しています)。
助言がありますか?私が見逃しているのはただのばかげたものだと確信しています....
asp.net-mvc-3 - Ninject/MVC3 カスタム モデル バインダー - アクティブ化エラー
セッション辞書クラスへの依存関係をコントローラーのコンストラクターに挿入しようとしています。例えば:
私のglobal.asaxファイルでは:
私のSessionDictionaryBinder:
/account/login にアクセスすると、次のエラーが表示されます。
DI に Ninject を使用していますが、App_Start ディレクトリに含まれるファイルの他のバインディングは正常に動作します。モデルバインダーがそのファイルに入るはずだと思いますが、構文は何ですか?
乾杯!
asp.net-mvc - Castleを使用したMVC3モデルバインディング
私はMVCにまったく慣れていません。interface
モデルのプロパティとしてを使用しています。
私は自分Data Annotation Attributes
が無視されていることに気づきました。フォームの送信中にもエラーが発生しました。
インターフェイスのインスタンスを作成できません。
カスタムを使用する必要があることがすぐにわかりましたModelBinder
CreateModel
のメソッド内で何をする必要があるかを理解するのに苦労していますModelBinder
私は次のものを持っていますRegistrationModel
:
IPlace
インターフェイスと実装は次のとおりです。
asp.net-web-api - ASP.Net Web API モデル バインディングが MVC 3 のように機能しない
ASP.Net Web API のモデル バインディングは、MVC でサポートされるのと同じ最小レベルの機能でバインディングをサポートするはずだという印象を受けました。
次のコントローラーを使用します。
私はそれを要求しています:
残念ながら、モデルは MVC のようにバインドしません。私が期待するように、これが拘束力を持たないのはなぜですか? アプリケーションにはさまざまなモデル タイプが含まれます。MVC の場合のように、バインディングが機能するのであればいいと思います。
asp.net-mvc-3 - DataAnnotation をサポートする IModelBinder
IModelBinder を実装するカスタム ModelBinder を使用する必要があります。このコードを直接変更することはまったくできません。現在、渡されたモデルの DataAnnotations から ModelState を更新するためのサポートはありません。ModelBinder をサブクラス化し、そのサポートを追加したいと考えています。そのサポートを追加して、DefaultModelBinder が DataAnnotations と連携するようにするにはどうすればよいでしょうか?