永続化されていない変更されたオブジェクトを、フォームなしでビューからコントローラーに戻す方法は?

StackOverflow https://stackoverflow.com/questions/295200

  •  08-07-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

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

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

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

[編集] 2番目の投稿への応答:

カスタマイズされたオブジェクトを使用するアクションへのリンクを戻したいとしましょう。特定のキーを使用して、カスタマイズされたオブジェクトをTempData(または、複数のポストバックを通してさらに必要な場合はSession)に保存できます。次に、アクションリンクを構築し、オブジェクトのキーを値として匿名クラスのActionLinkに提供できます。これにより、キーがリクエストパラメータとして返されます。アクションでは、このパラメーターのキーを使用して、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
}

他のヒント

@tvanfosson

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top