問題タブ [modelbinders]

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.

0 投票する
3 に答える
3495 参照

asp.net-mvc - ASP.NetMVCのモデルバインダーを使用した親/子レコードの更新

次のコードをDinnerForm.ascxに追加して、子レコードを編集できるようにNerdDinnerアプリケーションを変更しました。

これをレンダリングしています:

DinnersControlerのPostEditActionメソッドを変更していません。親ディナーは通常どおり更新されますが、UpdateModel(dinner);のように見えます。子RSVPレコードを表示/更新していません。

モデルバインダーがコレクションを表示できるように、子レコードのレンダリングにいくつかのバリエーションを試しましたが、運がありません。

UpdateModel(Parent);を呼び出すことにより、親/子レコードを一度に更新しています。現在のモデルのバインダーで可能ですか?

0 投票する
2 に答える
447 参照

asp.net-mvc - ASP.NET MVC の同じページで同じ .ascx の 2 つのインスタンスを使用する方法は?

Address.ascxASP.NET MVC ページにコントロールの 2 つのインスタンスがあります。

もちろん、このようなコードを使用すると、住所の各フィールドに同じ ID が割り当てられます。フィールドの ID に文字列を簡単に追加できるので、 と がありますが、'Street1_billing'これ'Street1_shipping'をモデルにマップする方法がわかりません。

モデルをアイテムの配列にマッピングするための最良の解決策は何ですか(この場合は2つだけ)。これに対する ASP.NET の「すぐに使える」ソリューションについては知りません。

注: これはこの質問と少し似ていますが、Scott Hanselman のこのソリューションを使用できますが、私が望むものとはまったく異なります。私の場合、2 つのアイテムがあることがわかっているので、基本的には 2 アイテムの配列ですが、もう少しエレガントなソリューションがあるかどうか疑問に思っています。

PS。これは以前に何度も尋ねられたと思いますが、正しい検索用語を入力できないようです. だまされていることに気付いている場合は、この質問をリンクしてください。

0 投票する
1 に答える
277 参照

asp.net-mvc - カスタムモデルバインダーからオブジェクトを取得する必要がある場合、バインダーはサービスレイヤー、リポジトリレイヤー、または...と相互作用する必要がありますか?

これに似たクラスがある場合:

カスタムモデルバインダーを作成すると、フォームからの投稿はペットで送信されません。次のようなデータが送信されます。firstName: "myFirstName" lastName: "myLastName" myPet: "myPetsName"

実際のPetオブジェクトではなく、Petの名前が渡されるため、Petオブジェクトはモデルバインダー内から取得する必要があります。

私の質問は、モデルバインダーがサービスレイヤー、リポジトリレイヤーと相互作用する必要があるのか​​、それともペットを取得する必要があるのか​​ということです。サービスレイヤーの問題は、サービスの初期化時にModelStateにアクセスできないように見えることです:((this.ModelState)でエラーが発生します)

Personオブジェクトを作成するためにモデルバインダーが必要な場合は、ペットを何らかの方法で割り当てる必要があります...これをどのように行うのですか?

0 投票する
2 に答える
883 参照

asp.net-mvc - ASP.NET MVC - モデル バインドへのページのテスト

モデル バインダーをカバーする単体テストがあります。ModelBindingContext を作成し、ValueProviderDictionary にテスト値を入力します。コントローラーがモデルを取得したら、すべてがテストでカバーされ、正しいことが起こっていると確信しています. また、BindingContext が正しければ、モデルが正しくバインドされると確信しています。私が自信を持っていないのは、ビューがポストバックされたときに BindingContext を適切に設定することです。

フォームに記入し、ポストバックし、結果のビューをチェックする WatiN テストを書き始めました。これは問題ありませんが、非常に... 間接的です。たとえば、送信をクリックした後に「注文が保存されました」と表示されるページでは、データベースにアクセスして、正しく保存されたかどうかを確認する必要があります。コントローラーに渡されたモデルが x の場合、y がデータベースに保存されることをカバーするテストが既にあります。ビュー テストでこのコードを繰り返すのはなぜですか?

私が本当に望んでいるのは、ビューにデータを入力し、送信をクリックして、(a) BindingContext または (b) ModelBinder から返されたモデルのいずれかをチェックすることです。

このようなことを行う方法に関する慣行はありますか?


これが WatiN テストに追加されることを追加したかっただけです。現在、約 50 個の WatiN テストがあります (さらに追加する必要があります)。WatiN なしで上記を実行できたとしても、ほんの一握りのテストしか削除されません。私は WatiN を使い続けるつもりですが、今はこれらのいくつかのテストのために悪用しているように感じます。

0 投票する
2 に答える
1268 参照

asp.net-mvc - asp.net mvc で viewmodel と modelbinder を使用する場合のドロップダウン値 null

ビューから投稿するときにフォームの値をエンティティにバインドするために、asp.net のモデルバインダー機能を使用しています。

HTML は、正しいオプションと値の項目を使用して、最初のビューで正しくレンダリングされます。

フォームに入力して投稿すると、ドロップダウン リストの値を除くすべての値がエンティティに正しく取り込まれます。私が間違っているのかわかりません。

以下に添付されたコード:

顧客エンティティ:

ビューモデル:

コントローラ:

意見:

0 投票する
3 に答える
1803 参照

asp.net-mvc - ASP.NET MVC 2 での空のクエリ文字列パラメーターのモデル バインド

ここで説明する動作は、ASP.NET MVC 2 (少なくともプレビュー 1) の既定のようです。

このようなクエリ文字列をモデルバインドする場合:

次のバインドが発生します (「Foo」および「Bar」文字列プロパティを持つモデルにバインドしていると仮定します)

ASP.NET MVC 1

ASP.NET MVC 2 (RC によるプレビュー 1)

これは ' gu-notes 'に記載されていなかったので、V2 で遊んでいる人に注意を促したかったのです。また、これが最終的な実装になるのか、それとも設定可能な機能になるのかについて、知っている人がコメントできるかどうかも知りたいですか? 私はどちらの方法でも大丈夫ですが、彼らが古い方法に戻らないことを願っています! 構成可能であることはさらに良いでしょう。

編集:この時点から学ぶべき教訓は、空の文字列をテストするために Foo.Length == 0 を指定するコード、または最小長をチェックするために Foo.Length > 3 を指定するコードを作成しないことです。string.IsNullOrEmpty(Foo) を使用するか、最初に null をチェックしてください。


更新:この質問は、なぜ彼らが実際にこの変更を行うのかについて、私の好奇心をかき立てました。無効化されたコントロールを研究しているときに、答えに出くわしたと思います。W3 HTML 仕様では、「成功したコントロール」を次​​のように定義しています。

成功したコントロールは、送信に対して「有効」です。成功したすべてのコントロールには、送信されたフォーム データ セットの一部として、現在の値とペアになっているコントロール名があります。正常なコントロールは FORM 要素内で定義する必要があり、コントロール名が必要です。

つまり、成功したコントロールは、クエリ文字列パラメーターとしてサーバーに返されるコントロールです。ここで、コントロールに有効な値がない場合、仕様に従って:

フォームが送信されたときにコントロールに現在の値 がない場合、ユーザー エージェントはそれを成功したコントロールとして扱う必要はありません。

(ここで「解釈する必要はありません」という言葉を見つけてください)

Foo=&Bar=したがって、空の文字列の代わりに null を送信することで、特定のブラウザーが送信する可能性があり、他のブラウザーがそのクエリ文字列パラメーターを送信しない可能性があるブラウザーの非互換性を減らすことができると思います。Foo=常にFoo がまったく存在しないかのように解釈することで、より防御的になります。

ここでの理由については、少なくとも正しい軌道に乗っていると思います-そして、少なくとも部分的には「成功したコントロール」の概念と関係があります。

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

0 投票する
1 に答える
2489 参照

asp.net-mvc - ASP.NET MVC フレームワークの MVVM と ModelBinders

私は一連のビューを持っています。それぞれが自分自身を表示するために必要なすべてを含む独自の ViewModel クラスを持つように型付けされています。次に例を示します。

私が使用したいポスト アクション メソッドは次のようになります。

関心のある唯一のオブジェクトは、CreateResourceViewModel 自体ではなく、CreateResourceViewModel の Resource プロパティであることに注意してください。他のすべてはユーザーにとってはグレービーであり、更新しているのはリソースクラスです...

これは MVC フレームワーク内で可能ですか (v2 CTP であっても)?

皆さんありがとう

0 投票する
3 に答える
596 参照

asp.net-mvc - ASP.NET MVC、LINQ、ModelBinders

DataContext からオブジェクトを取得し、HTTP ポストで更新するために LINQ で使用できるビルド済みの ModelBinder はありますか?

たとえば、現在、次のコード ブロックがあります。

(IProjectService は LINQ データ コンテキストへの呼び出しをラップします)

実際に LINQ データ コンテキストを介してデータベースの更新を実行するには、プロジェクト インスタンスを再度取得してから、そのインスタンスを更新する必要があります。

最初にデータ コンテキストからプロジェクト インスタンスを取得せずに単にプロジェクト インスタンスを保存しようとすると、データベースに何も書き戻されません。LINQ データ コンテキストはオブジェクトについて何も知らないため、それに対して何もしないと仮定しています。

Projects テーブル クラスで Attach メソッドを使用しても機能せず、例外がスローされます。

0 投票する
3 に答える
375 参照

asp.net-mvc - ModelBinder を使用して検証を実装する方法 [および場所]

ASP.NET MVC、MySQL、NHibernate を使用して小さなサイトを開発しています。

私は連絡先クラスを持っています:

モデル バインダー:

また、次のアクションを使用して、データベースを更新するためのフォームを含むビューがあります。

ここまでは、すべて正常に機能しています。しかし、連絡先を更新する前に、フォームの検証を実装する必要があります。

私の質問は: この検証をどこに実装すればよいですか? ActionResult メソッドまたは Model Binder で? それともどこか?

どうもありがとうございました。

0 投票する
1 に答える
1951 参照

asp.net-mvc - セッションに保存されたオブジェクト用に Sanderson のカスタム mvc ModelBinder を拡張する

Steven Sanderson は、彼の素晴らしい MVC の本で、セッション変数を設定および取得するカスタム モデル バインダーの例を示し、コントローラーからデータ ストレージ要素を隠します。

これを拡張して、かなり一般的なシナリオに対応しようとしています。セッションに User オブジェクトを保存し、これをすべてのアクション メソッドでパラメーターとして使用できるようにしています。ユーザーの詳細が変更されていない場合、サンダーソンのクラスは正常に機能しましたが、ユーザーが詳細を編集し、修正されたオブジェクトをセッションに保存できるようにする必要があります。

私の問題は、bindingContext.ValueProvider.Keys のキーの数を確認する以外に、GET と POST を区別する方法が見つからないことです。これは間違っているようで、何かを誤解していると確信しています。

誰かが私を正しい方向に向けることができますか? 基本的に、すべてのアクションは現在のユーザーにアクセスする必要があり、UpdateMyDetails アクションは同じオブジェクトを更新する必要があり、すべてセッションによってサポートされます。これが私のコードです...