問題タブ [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 - カスタム モデル バインダー - 再検証する方法
私は ASP.NET MVC 2 を使用しており、カスタム バインダーを使用してモデルにデータが入力された後に、モデルの検証を再トリガーする方法を理解したいと考えています。
そのため、関連付けられているいくつかの EF クラス、予約と旅行者 (各予約には 1 人以上の旅行者を含めることができます) から始めます。
予約にバリデーションを設定するために使用しているバディ クラスは次のとおりです。
カスタム モデル バインダーを使用して予約と関連付けられている旅行者を設定しますが、ModelState.IsValid は、カスタム モデル バインダーが旅行者を予約オブジェクトに追加する前に設定されているように見えます。 ["Travellers"] には、少なくとも 1 人の旅行者が添付されている必要があるという検証エラーがまだ含まれています。
カスタム モデル バインダーが処理を行った後に検証を再トリガーする方法はありますか?
asp.net-mvc - グローバル数値形式のASP.NETMVCモデルバインダー
デフォルトのモデルバインダーは、小数点以下の数値フォーマットが異なる国(1.2 = 1,2など)でアプリケーションを使用している場合、double型のプロパティに対してエラーを返します。サイトのカルチャは、私のBaseControllerで条件付きで設定されます。
カスタムモデルバインダーを追加してbindModel関数をオーバーライドしようとしましたが、Cultureが既にデフォルトのen-GBに設定されているため、エラーを回避する方法がわかりません。
そこで、カルチャを設定するアクションフィルターをBaseControllerに追加しようとしましたが、残念ながら、bindModelはアクションフィルターの前に起動されるようです。
どうすればこれを回避できますか?カルチャをリセットしないようにするか、bindModelが起動する前に元に戻すか。
モデルが無効になるコントローラー:
カルチャが設定されているフィルタ:
カスタムモデルバインダー:
c# - カスタム モデル Minder のバインド エラーにより、ユーザーが入力した値が削除される
私は ASP.NET MVC 3 RTM を使用しており、次のようなビュー モデルがあります。
プロパティは私が持っているカスタム構造体で、TimeOfDay
非常に単純なので、ここには含めません。この構造体をバインドするカスタム モデル バインダーを作成しました。モデル バインダーは非常に単純です。
私のカスタム モデル バインダーは正常に動作しますが、問題は、ユーザーが指定した値を変換または解析できなかった場合です。これが発生した場合 (TimeOfDay コンストラクターが をスローした場合ArgumentException
)、ビューに正しく表示されるモデル エラーを追加しますが、変換できなかったユーザーが入力した値は失われます。ユーザーが値を入力したテキストボックスは空で、HTML ソースでは value 属性が空の文字列 "" に設定されています。
編集:何か間違ったことをしているのが私のエディターテンプレートではないかと思っているので、ここに含めます:
ユーザーが値を修正できるように、バインド エラーが発生したときに値が失われないようにするにはどうすればよいですか?
c# - タイプがnull許容の場合、カスタムモデルバインダーは呼び出されません
TimeOfDay
次のようなビューモデルで使用されるカスタム構造体があります。
と呼ばれるカスタムモデルバインダーを作成し、次のTimeOfDayModelBinder
ようにGlobal.asax.csに登録しました。
そして、すべてがうまく機能します。ただし、ビューモデルを次のように変更すると、次のようになります。
私のカスタムモデルバインダーはもう呼び出されません。プロパティがTimeOfDayのタイプではなく、異なるNullableであることを私は知っています。つまり、次のように、Global.asax.csにカスタムモデルバインダーを2回追加する必要があるということです。
それは機能しますが、私が気に入らないことがあります。これは私の型をnull許容として処理するために本当に必要ですか、それとも私が欠けているものがありますか?
c# - MVCでカスタム文字列オブジェクトのモデルバインドを作成するには?
カスタム文字列オブジェクトを作成しましたが、サーバーにポストバックしてもモデル バインドされません。クラスなどに欠けている属性はありますか?
これは、以下のカスタム文字列クラスです。
asp.net-mvc - MVC3 での Html.EditorFor の問題
AddEditItemVM というビューモデルに入力されたフォームを含むビューがあります。このビューモデルには次のプロパティがあります。
私がしようとしているのは2つのことです:
私のビューモデルの一般的なカテゴリリストで各カテゴリのチェックボックスをレンダリングします。
フォームが投稿されたときに、コントローラーのアクションで、インスタンス化されたプロパティCategoriesを受け取るようにします ( AddEditItemVM のインスタンスに)
最初の点について、(m=>m.Categories) のようなラムダ式を使用してチェックボックスのグループをレンダリングするヘルパー (存在する場合) を使用したいと思います。代わりに、foreach を使用してチェックボックスをビューにレンダリングします。
2 番目の点について、MVC にはCustom Model Bindersという機能があることを読みました。これらは、ValueProviders (クエリ文字列、Cookie、またはフォーム値) から値を取得し、フォームが投稿された後に呼び出される特定のアクションに渡す必要なインスタンスを作成します。インスタンス化されたプロパティ カテゴリを受け取るには、カスタム モデル バインダーを 1 つ作成する必要がありますか?
asp.net-mvc - 二重値バインディングの問題
私のプロジェクトでは、ユーザーが「,」または「.」を使用して、2 つの形式で double 値を入力できるようにしたいと考えています。区切り記号として(指数形式には興味がありません)。区切り文字「.」を使用したデフォルト値 働かないでください。この動作が複雑なモデル オブジェクトのすべての double プロパティで機能することを望みます (現在、識別子と値を含むオブジェクトのコレクションを使用しています)。
何を使用する必要がありますか: 値プロバイダーまたはモデル バインダー? 私の問題を解決するコード例を示してください。
c# - A は、既に機能しているものから新しい CustomModelBinder を作成しました。新しいものは、バインディングを行うために呼び出されないのはなぜですか?
このようなことはできますか?
global.asax.cs application_start の次の場所
アップデート
というわけで、何がおかしいのか調べてみました。これが私の新しいコードです。問題はこの WizardViewModel とバインダーにあるようです。アプリケーションに期待することと、受信するウィザード モデルを「伝える」ものは何ですか?
global.asax.cs application_start の次の場所
完全なバインダー コード
c# - カスタムモデルバインダーを使用する場合のNullReferenceException
抽象クラスのバインダーを作成しようとしています。バインダーは、使用するクラスの実装を決定します。
だから私はペットを連れて行くコントローラーを持っています、バインダーはそれが犬、猫、家畜のどれであるかを(種のひもに応じて)決定します。
これはうまく機能しますが、ペットが別の構造(List<Pet>
または別のオブジェクトなど)に入るとすぐに、NullReferenceException(var name = (string)values.GetValue("name").ConvertTo(typeof(string));
PetBinderの行)が発生します。私は何が間違っているのですか?
テストするPersonクラスを追加しました。また、NullReferenceExceptionが発生しました。
ccurrensは、var name = (string)values.GetValue("name").ConvertTo(typeof(string));
nullが返された理由は、リストから値を取得できなかったためだと述べました。
名前が付けられているのはわかりますが、オブジェクト内の場合は名前が付けられ[n].name
、[n].species
単一の場合は名前が付けられているだけです。List<Pet>
Person
pet.name
pet.species
Pet
name
species
解決
[n]
の正しいプレフィックス(またはpet
その他)を持つパラメーター名を取得するためにGetValue
、次のコードを使用しました。
誰かが興味を持っているなら、私はこの答えDefaultModelBinder
に似たものを使うことから継承することになりました。これが私が使用した完全なコードです:
asp.net-mvc-3 - クラスがWebActivatorを使用してアクティブ化されているかどうか、およびIModelBinderをModelBinderProviders.BinderProvidersに追加するかどうかのテスト。
StackExchangeの親愛なる仲間。
カスタムモデルバインダーがModelBinderProviders.BinderProvidersコレクションに追加されているかどうかをテストしようとしています。global.asaxを混乱させないように、WebActivatorを介してこれをアクティブ化することにしました。すべて正常に動作しますが、テスト:
WebActivator.ActivationManager.Run()メソッドを使用しようとしましたが、ロードされませんでした。私のテストでは次のようなものがあります。
そしてこれは私のapp_Startクラスです: