問題タブ [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.
model-view-controller - BindModel() 実装は何をすべきですか?
DefaultModelBinder.BindModel() をオーバーライドしたり、IModelBinder.BindModel() を実装したりする場合に準拠する必要があるセマンティクスを理解しようとして、 MVC 3 ソース コードを読んでいます。
作業が完了したら、BindModel() が他のオブジェクトをどの「状態」に残す必要があるかは、私にはわかりません。確かに、ValueProvider データの何らかの解釈を表す値を返すと想定されていますが、どのような副作用があると想定されているのでしょうか? 例えば:
- MVC は、メソッドが終了した *後* BindModel() に渡された bindingContext の状態について期待していますか?
- ModelMetadata で IModelBinder.BindModel() を設定する必要があるとすれば、それは何ですか? (DefaultModelBinder は、BindModel() によって呼び出される BindProperty() メソッドでプロパティ メタデータを設定します。)
- DefaultModelBinder.BindModel() のオーバーライドで ModelState.AddModelError() を呼び出す必要がありますか、それとも BindProperty() でより適切な場所をオーバーライドする必要がありますか (特に、DefaultModelBinder のデフォルトの動作を可能な限り利用したい場合)。
DefaultModelBinder には非常に多くのセマンティクスが配管に組み込まれているため、何かをオーバーライドすると非常に危険に感じられます (つまり、リスコフの原則に違反せずに何かをオーバーライドすることはできないように感じます)。ドキュメントの欠如は役に立ちません。
asp.net-mvc - フォームとリストを備えたMVC3:デフォルトのモデルバインダーとEditorFor
モデル:
デフォルトのEditorFor(model => model.Entries)を使用する場合、名前/IDの値は次のとおりです。
代わりに、次のようなEditorForテンプレートを作成したい場合:
生成される名前/IDの値は次のとおりです。
したがって、名前にはプロパティ名と[0]の間にピリオドがあり、IDにはインデックス番号の左側に余分なアンダースコアがあります。これは、デフォルトのモデルバインダーでは機能しません。デフォルトのモデルバインダーで機能するこれを行う方法はありますか?
asp.net-mvc - ASP.NET MVC ModelBinderのバグ:リクエスト変数"id"をモデルのプロパティ"Id"にバインドする
MVC3ファイナルRTMを使用しています。
与えられた
このルート:
そして、投稿のページ、たとえば/ blog / posts / 2 / some-slugで、部分ビューをComment
モデルにバインドします。
そして、Comment
がありpublic int Id {get; set;}
ます。
そして、部分的なビューでは、私はこれを持っています:
なぜこれを表示するのですか?
そして、に変更Id
するComment
とCommentId
、正しく値が設定されるのは0
なぜですか?
デフォルトのモデルバインダーが{id}
ルートのにバインドされていると思います。
asp.net-mvc-3 - 動的モデルとModelState
私はこのようなアクションを持っています:
Update([Bind(Prefix = "CurrentModel")] dynamic edited)
しかし、動的を使用すると、ModelState.IsValid
常にtrueが返されるため、動的オブジェクトに検証がないように見えますか?そうでない場合、どうすればこれを解決できますか?
asp.net-mvc-3 - ASP.Net MVC3 親子モデル バインディング
User オブジェクトをモデルとして使用する部分テンプレートがあります。ユーザーはアカウントのコレクションを持っています。この部分テンプレートには、次のようなループがあります。_Account 部分テンプレートは Account クラスにバインドされています
私のコントローラーメソッドでは、最初に試しました
しかし、User.Accounts コレクションは空です。それから私はこれを試しました。Accounts コレクションはまだ空です。
これを達成するためにデフォルトの Modelbinder 実装を使用できますか、それとも何か違うことをする必要がありますか?
asp.net-mvc-2 - デフォルトのモデル バインダー
基本的に、約100個の要素を持つフォームがあります。フォームを送信すると、値がモデルにバインドされます。しかし、値が設定される前に、フォーム要素の特定の値に取り組みたいです。基本的に、フォームの要素の 95 の値をデフォルトのバインダーで設定したいのですが、設定する前に 5 つの要素の値を処理したいと考えています。
デフォルトのモデルバインダーをオーバーライドしてそれを行う方法について何か提案はありますか?
c# - デフォルトのモデルバインダーは、IEnumerableのNullable型にバインドしません
定義が次のように見えるコントローラーアクションがあります-
そしてモデル:
'Name'プロパティはコントローラーアクションに入力されますが、SourceIdプロパティはnullのままです。長いdestinationId ? _ パラメータも入力されます。
MVC(バージョン2)ソースコードをステップ実行している間、これはDefaultModelBinderによってスローされる例外です。
タイプ'System.Int32'からタイプ'System.Nullable`1[[System.Int64、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]'へのパラメーター変換が失敗しました。これは、タイプコンバーターが変換できないためです。これらのタイプ。
モデルがlong?ではなくlongに変更された場合、デフォルトのモデルバインダーが値を設定します。
これは既知の問題ですか?MVCソースコードが最適化されているため、ほとんどのコードをステップスルーできません。
更新:送信されるリクエストは、Jsonを使用したHttp POSTであり、ソースJSonは次のようになります-
asp.net-mvc-2 - デフォルトのバインダーの問題 (おそらく単純)
ASP.NET MVC 2 アプリケーションを構築しており、次のアクションを含むコントローラーがあります。
これに対して、次のような強力な型付きビューを取得しました。
送信ボタン (コードには表示されていません) を押すと、パブリック ActionResult Edit(EditUser user) アクションがヒットしますが、ユーザー オブジェクトにはデータが含まれませんか?
これは、htmlの一部がどのように見えるかです:
これは、入力が正しいプロパティを指していることを意味するはずです。
言及する価値があるのは、データ アノテーションを使用してアクションに送信されたオブジェクトを検証することですが、モデルはいくつかの必須フィールドがある場合でも常に有効です。
なぜこれが起こっているのですか?
asp.net-mvc-3 - モデルバインダーと非表示フィールド
この質問をするのに役立つ簡略化されたテストシナリオがあります。製品には多くのコンポーネントを含めることができ、コンポーネントは多くの製品に属することができます。EFがクラスを生成しました。次のように、クラスをスリム化しました。
コンポーネントの作成は、次のコントローラーアクションを介して実行されます。
GETメソッドによって返されるビューは次のようになります。
ここから、コンポーネントの作成が上記を介して同じページで処理されていることがわかりますHtml.Action
-そのビューのコードは次のとおりです:
わかった。これが私が苦労していることです。model
適切に入力するには、[HttpPost] backのパラメーターが必要です。つまり、nullの製品で新しいコンポーネントを作成できないため、製品が含まれている必要があります。製品を入手するには、製品のIDで検索する必要があります。私はできるはずだと思っています:
model
または、IDの受信に依存するそのようなもの。これは、ビューがIDをそこに、おそらく非表示のフィールドに配置する必要があることを意味します。ビューコードからわかるように、これを設定しようと何度か試みましたが、すべて失敗しました。
通常、私は* Forメソッドを好みます。これは、正しい命名法を生成する責任があるためです。.Productsが単数形(.Product)の場合、それを参照できx => x.Product.Id
、すべてがうまくいくでしょうが、複数形であるため、正しい値をコンパイルして生成するが名前を取得するものx => x.Products.Id
を試しました(これは間違っていますモデルバインダーは、そうではないと考えています。x => x.Products.First().Id
Id
Component.Id
Component.Products[0].Id
私の2番目の試みは、HiddenFor
(私が行うように)反復させることでしたEditorFor
:
しかし、それは何も生み出しません-私はこのヘルパーが反復しないことを読みました。試しx => x.Products.First()
ましたが、コンパイルすらできません。最後に、私は* Forを放棄し、名前を自分でコーディングすることにしました。
それは正しいように見えますが、ポストバックには私の値(Products.Count
== 0)が表示されません。いくつかの投稿で、その形式は次のように見えるはずです[0].Id
が、それも機能しません。grr..。
私はそれを次のようにコーディングできると思います:
次に、コントローラーのアクションを次のように再宣言します。
しかし、それは厄介なようです。これがとても難しいとは信じがたいです。誰か助けてもらえますか?
- e
ps誰かが気にかけたら、ダウンロードできるようにするプロジェクトがあります
c# - .Net MVC3 カスタム モデル バインダー - モデルの初期読み込み
モデルを着信値で更新する前に、最初にデータベースからモデルをロードするカスタム モデル バインダーを作成しています。(DefaultModelBinder から継承)
これを行うには、どのメソッドをオーバーライドする必要がありますか?