問題タブ [defaultmodelbinder]
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 ベータ 1: DefaultModelBinder は、無関係な要求間でパラメーターと検証状態を誤って保持します
デフォルトのモデル バインディングを使用してフォーム パラメータをアクションのパラメータである複雑なオブジェクトにバインドすると、フレームワークは最初のリクエストに渡された値を記憶します。つまり、そのアクションへの後続のリクエストは最初と同じデータを取得します。パラメーター値と検証状態は、関連のない Web 要求間で保持されます。
これが私のコントローラーコードです(service
アプリのバックエンドへのアクセスを表します):
私の .aspx ビュー ( ViewPage<RunTime
> として厳密に型指定されたもの) には、次のようなディレクティブが含まれています。
これは、モデルのプロパティを自動バインドするためDefaultModelBinder
のクラスを使用します。
ページにアクセスし、有効なデータを入力します (例: time = 1)。アプリは新しいオブジェクトを時間 = 1 で正しく保存します。次に、もう一度押して、別の有効なデータ (時間 = 2 など) を入力します。ただし、保存されるデータは元のものです (たとえば、時間 = 1)。これは検証にも影響するため、元のデータが無効であった場合、今後入力するすべてのデータが無効と見なされます。IIS を再起動するか、コードを再構築すると、永続化された状態がフラッシュされます。
この問題は、独自のハードコーディングされたモデル バインダーを作成することで解決できます。その基本的な単純な例を以下に示します。
何か不足していますか?最初のデータが 1 つのブラウザーに入力され、2 番目のデータが別のブラウザーに入力された場合に問題を再現できるため、ブラウザー セッションの問題ではないと思います。
asp.net-mvc - パラメータがModelの場合、ASP.NETMVCはファイルモデルバインディングを投稿しました
カスタムモデルバインダーで要求コンテキストを手動で確認したり、投稿されたファイルのみを入力として受け取る別のアクションメソッドを作成したりせずに、投稿されたファイル(<input type="file" />
)をASP.NET MVCのモデルバインディングに参加させる方法はありますか?
私はこれがうまくいくと思っていたでしょう:
しかし、上記のシナリオを考えるMyFile
と、バインディングコンテキストの値プロバイダー値の一部でさえありません。(OtherProperty
もちろんです。)しかし、これを行うと機能します。
では、パラメーターがモデルの場合、なぜバインディングが発生しないのでしょうか。また、どうすればそれを機能させることができますか?カスタムモデルバインダーを使用しても問題はありませんが、カスタムモデルバインダーでこれを確認せずに行うにはどうすればよいRequest.Files["MyFile"]
ですか?
一貫性、明確性、テスト容易性のために、リクエストコンテキストを手動で検査することなく、投稿されたファイルにバインドされたプロパティを含む、モデル上のすべてのプロパティの自動バインドをコードで提供したいと思います。私は現在、ScottHanselmanが書いたアプローチを使用してモデルバインディングをテストしています。
それとも私はこれを間違った方法で行っていますか?これをどのように解決しますか?または、Request.FormとRequest.Filesの分離の歴史があるため、これは設計上不可能ですか?
asp.net-mvc - Asp.Net MVC の千区切り記号付きの 10 進数値
10 進数メンバーと、このクラスのエントリを受け入れるビューを含むカスタム モデル クラスがあります。入力コントロール内の数値をフォーマットするためにJavaScriptを追加するまで、すべてがうまくいきました。書式コードは、ピントがぼけている場合に、入力された数値を千区切り「,」で書式設定します。
問題は、モーダル クラス内の 10 進数値が、3 桁区切り記号で適切にバインド/解析されないことです。ModelState.IsValid は、「1,000.00」でテストすると false を返しますが、「100.00」では変更なしで有効です。
これに対する解決策があれば教えていただけますか?
前もって感謝します。
サンプルクラス
サンプルコントローラー
サンプルビュー
アレクサンダーが提案したように、カスタムModelBinderで回避策を試しました。問題は解決しました。しかし、このソリューションは IDataErrorInfo の実装ではうまくいきません。検証のため、0 が入力されると Salary 値は null になります。何か提案はありますか?Asp.Net MVC チーム メンバーは stackoverflow に参加しますか? 少し手伝ってもらえますか?
アレクサンダーが提案したように、カスタムモデルバインダーでコードを更新しました
モデルバインダー
従業員クラス
asp.net - ネストされたリストを持つASP.NETMVCDefaultModelBinder
従業員のタイムシートを表すテーブルを含むビューがあります。上部の日数、側面のプロジェクト。各日/プロジェクトの交差点には、通常の時間と残業の2つの値が含まれています。
ページモデルの(簡略化された)クラス定義は次のとおりです。
ページ上のフォーム要素は、DefaultModelBinderがそれらを取得できるようにするために、次のように名前が付けられています。
ただし、ビューが送信されると、model
パラメーターが完全に入力されていません。model.Projects
プロジェクトが含まれていますが、Project
'sWorkUnits
フィールドは空です。DefaultModelBinder
私がやろうとしているようなネストされたコレクションをサポートしていますか?そうでない場合は、どうすればよいですか?
asp.net-mvc - ASP.NET MVC:フォームPOSTをパラメーターにバインドするときに密結合を回避する
私が次のようなインターフェースを持っているとしましょう:
そして、ASP.NET MVCには、次のようなコントローラーアクションに投稿するフォームがあります。
SimpleThingは、 IThingをほとんど実装しない具象クラスです。
ただし、すべてのメソッドでインターフェイスを処理する必要があります。NHiberateと独自のIThing実装(RealThingと呼びましょう)を使用するデータアセンブリがあります。SimpleThingは「不明なエンティティ」について文句を言うので、渡すことができません。
誰かがこれを行うためのよりクリーンな方法について何かアイデアがありますか?ファクトリクラスを使って何かを考えていました。しかし、MVCフォームバインダーでそれを使用するにはどうすればよいですか?
ありがとう!
asp.net-mvc - 既定のモデル バインダーでリフレクションによって作成されたオブジェクトを使用する場合の ASP.NET MVC の問題
formCollectionが渡されたときにオブジェクトがUpdateModelで更新されないという ASP.NET MVC で奇妙な問題が発生しています。更新中のオブジェクトがリフレクションによって作成されている場合、 UpdateModelが正しく機能していないように見えます。
シナリオ: 約 50 のルックアップ テーブルを持つアプリケーションがあります。各ルックアップ テーブルには、id、title、description、isactive、createdon などの典型的なフィールドを含むまったく同じスキーマが含まれています。50 個のビューを作成するのではなく、すべてのルックアップ テーブルのデータを表示できる単一のビューが必要でした。IReferenceEntity というインターフェイスを作成し、ルックアップ テーブルを表す各 POCO に実装しました。
このインターフェイスを使用すると、ルックアップ テーブルのレコードをビューに簡単に取り込むことができます。(次の方法でアイテムをビューに渡します。)
データベースからビューまで、すべてが完璧に機能します。
ただし、投稿時にモデルを更新しようとすると、いくつかの問題が発生します。
次のようにオブジェクト参照を明示的に宣言すると、すべてが完全に機能し、オブジェクトの値がフォームの値で更新されます。したがって、データベースを更新できます。
残念ながら、オブジェクト タイプをハード コーディングすると、インターフェイスを使用する理由が完全に無効になります。
(アプリケーションの主な目的は、「特別な」ことを何もせずにルックアップ テーブルなどの新しいテーブルを動的に追加できるようにすることです。これは、読み込まれたアセンブリを反映し、特定のインターフェイスまたは基本クラスを実装するクラスを見つけることによって達成されます。 )
私の戦略は、ポストバック時にオブジェクトの具体的な型を決定し、リフレクションによってその型のインスタンスを作成することです。(型を決定するために私が使用するメカニズムはやや原始的です。フォーム内の非表示フィールドとして含めています。より良いアイデアを歓迎します。)
次のいずれかの方法でリフレクションを使用してオブジェクトのインスタンスを作成すると、UpdateModel によって更新されるオブジェクトはありません。
注: リフレクションによって作成されるオブジェクトがすべて適切なタイプであることを確認しました。
なぜこれが起こっているのか誰にも分かりますか?私はやや困惑しています。
私が本当に「苦労した」場合は、これらの参照エンティティ/ルックアップ オブジェクトのいずれかをインスタンス化するファクトリ オブジェクトを作成できます。ただし、これにより、新しいルックアップ テーブルを透過的に追加および検出できるようにするアプリケーションの機能が損なわれ、それほどクリーンではありません。
また、インターフェイスではなく、実際の ReferenceEntity 基本クラスから派生させることもできますが、これが違いを生むかどうかは疑問です。この問題は、リフレクションによって作成されたオブジェクトをモデル バインダーで使用する場合に発生するようです。
どんな助けでも大歓迎です。
アンソニー
asp.net-mvc - DefaultModelBinder: IList と List
これがバグなのか機能なのかはわかりません。いくつかの文字列プロパティを持つ ListRequest オブジェクトを受け取るアクション パラメータがあります。.NET MVC は、同じ名前のクエリ文字列パラメーターを ListRequest オブジェクトのプロパティに忠実にマップします。
クエリ文字列から取得した文字列のリストである ListRequest.Filters プロパティを追加します: ?filter=foo&filter=bar
.Filters を List(Of String) 型の Get/Set として宣言すると、DefaultModelBinder は期待どおりの動作をします。ただし、代わりに IList(Of String) の Get/Set として .Filters を宣言すると、DefaultModelBinder はそのプロパティへの値のバインドを完全に停止します。
これは機能ですか、それともバグですか?
asp.net-mvc - ASP.NET MVC 2 でのモデル バインディングのテスト
初め; MVC の内部をテストする必要がないことはわかっていますが、システムに流れ込むデータに関する一連のテストが本当に必要です。
HTTP コンテキストのすべてをモックすることなく、objectA (フォーム コレクション、辞書、コレクション、オブジェクトなど) が objectAModel に準拠しているかどうかをテストするにはどうすればよいでしょうか?
コントローラーをインスタンス化したり、アクションを呼び出したりする必要はありません。新しいオブジェクトがモデル状態を無効にするかどうかをテストしたいだけです。
簡単に書けばいいのに
asp.net-mvc - プロジェクトをasp.net mvc 1.0からasp.net mvc 2 betaに移行するときに、一部の単体テストが失敗しました
eric lipton が提供するこのアプリを使用して、Steve Sanderson の Pro ASP.NET MVC フレームワーク (asp.net 1.0 から mvc 2 ベータ版) からサンプルの SportsStore アプリを移行すると、2 つの単体テストを除いてすべて正常に動作します。
両方のエラー メッセージは次の
とおりです
。
パラメーター名: コンテキスト
バージョン 2 の既定のモデル バインダーが DataAnnotations をサポートしているためだと思われます。どうすれば修正できますか?
編集
Moq を使用して問題を解決しようとしましたが、うまくいきませんでした。コードは次のとおりです。
私がテストしているメソッドは、POST のみを送信します。テストに「POST」を付けても大丈夫ですか?