0

短い:モデルバインディングはどのようにビューからコントローラーにオブジェクトを渡しますか?

Long:
まず、ユーザーが検索フォームで指定したパラメーターに基づいて、データベースからいくつかのオブジェクトが取得されます。これらのオブジェクトには、顧客に表示される (定義はしない) メタ データが与えられます (例: オブジェクトの名前と価格は地域によって異なります)。
後でサイト内で、ユーザーはこれらのオブジェクトの詳細を表示するリンクをクリックできます。これらのメタ データは表示には重要ですが、定義には重要ではないため、以前に変更されたオブジェクトをコントローラーに戻す必要があります。デフォルトの asp.net mvc モデルバインディングを使用すると、.ToString() メソッドが使用されます。もちろん、これは完全なオブジェクトを再作成するための関連する文字列を返しません。
ISerializable インターフェイスが関係していると思いましたが、そうではありません。望ましい効果を得るにはどうすればよいですか?私がこの質問に直面した最初の人だとは想像できないので、どこかで何かが欠けていると思います...

4

2 に答える 2

2

既定のモデル バインディングは、フォーム パラメーターを名前で受け取り、引数リストで指定された型のプロパティと一致させます。たとえば、モデルに「価格」と「名前」のプロパティがある場合、フォームには「価格」と「名前」というID/名前の入力を含める必要があります(大文字と小文字を区別しない一致を行うと思われます)。バインダーは、リフレクションを使用して、これらのキーに関連付けられたフォーム値を適切な型に変換し、パラメーターによって指定された型の新しく作成されたオブジェクトのプロパティに割り当てます (これもリフレクションによって導出されます)。

このソースはhttp://www.codeplex.com/aspnetで実際に確認 (およびダウンロード) できますが、そこから MVC ソースにドリルダウンする必要があります。DefaultModelBinder ソースへのリンクを提供したいと思いますが、それらが構築される方法は、リビジョンが導入されるとリンクが変更されると思います。

したがって、質問に答えるには、再作成するオブジェクトのプロパティに対応するパラメーター (非表示の可能性があります) がフォームに必要です。フォーム (ビュー内) をコントローラーに POST すると、バインダーはフォーム パラメーターを使用して、指定された型のオブジェクトを再構成する必要があります。フォーム パラメーターの値をオブジェクト プロパティに変換する必要がある場合は、おそらく独自のカスタム モデル バインダーを実装する必要があります。

[編集] 2 番目の投稿への返信:

カスタマイズされたオブジェクトを使用するアクションへのリンクが必要だとしましょう。特定のキーを使用して、カスタマイズされたオブジェクトを TempData (または、複数のポストバックを通じて持続させる必要がある場合はセッション) に格納できます。次に、アクション リンクを作成し、オブジェクトのキーを値として匿名クラスの ActionLink に提供します。これにより、キーが Request パラメータとして返されます。このアクションでは、このパラメーターのキーを使用して、TempData からオブジェクトを取得できます。

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}
于 2008-11-17T12:35:42.230 に答える
0

@tvanfosson

ご説明ありがとうございます。リンクはどうですか?(フォームは関係ありません) 現在、Html.ActionLink(c=>c.Action(parameter), "label") はオブジェクトをパラメーターとして受け取ります。これらは URL 部分に変換する必要があります。このために、MVC は常に .ToString() メソッドに移動します。ToString メソッドでオブジェクトをシリアル化したくありません。
フレームワークが私のオブジェクトをシリアル化するのをどうにかして助けることができないのでしょうか? ISerialize インターフェースか何かを通して言いますか?

于 2008-11-17T14:44:11.567 に答える