2011-09-20 11 views
2

でのViewDataからオブジェクトを拡張し、私はMVCのAjaxヘルパーを使用してAjaxフォームを構築しています:http://msdn.microsoft.com/en-us/library/dd505013.aspxはMVC HtmlHelpers

コードは次のようになります。

Ajax.BeginForm("ActionName", "ControllerName", 
    new { 
      SomeProperty = (ViewData["SomeObject"] as SomeClass).SomeProperty, 
      AnotherProperty = (ViewData["SomeObject"] as SomeClass).AnotherProperty, 
      AllTheProperties = (ViewData["SomeObject"] as SomeClass).AllTheProperties, 
      otherProperty= ViewData["otherObject"] 
     }, 
    new AjaxOptions {}, 
    new {id = "anHtmlId"}); 

が、より多くの特性の多くはViewData["SomeObject"]でありますしかし、。

routeDataオブジェクトにできるだけ少ない行で単にViewData["otherObject"]を追加したいのですが、someObjectというプロパティのすべてを個別にレイアウトしたくないので、このコードを再訪することなくプロパティを追加することができます景色。

これらのオブジェクトをrouteDataパラメータとして渡すことを本質的に「マージ」すると便利です。


更新:アイデア:addThePropertiesOf()がマージされた新しいオブジェクトを返します

Ajax.BeginForm("ActionName", "ControllerName", 
    ViewData["SomeObject"].addThePropertiesOf(ViewData["otherObject"]), 
    new AjaxOptions {}, 
    new {id = "anHtmlId"}); 

。私は反射の高価なビットを使用したくない場合は、これはperformantと思われません。

+0

AutoMapperがぼやけているかもしれません。 –

+0

Automapperは、ビューをレンダリングするために何かのために釘の上で大槌のように思えます。 – StuperUser

+1

一方、 'otherObject'は' someObject'のプロパティであり、 'someObject'から望ましくないプロパティを取り除くために既存のライブラリを使いたいだけです。 –

答えて

4

HTMLにいくつかの値を送信するのは、入力要素としてフォームの一部ではないため、ユーザーが変更できない点です。ちょうどそれらをクエリ文字列パラメータとしてポストバックに戻します。意味がありません。これは帯域幅の無駄です。私はあなたがこのフォームを投稿するときにサーバーに送信する必要があり、すべての場合(ユーザーが変更できるすべてのフォームフィールドへのコースのほかに)いくつかのユニークな識別子である:すべての値の

Ajax.BeginForm(
    "ActionName", 
    "ControllerName", 
    new { id = (ViewData["SomeObject"] as SomeClass).Id }, 
    new AjaxOptions { }, 
    new { id = "anHtmlId"} 
) 
{ 
    ... some input fields that the user can modify and 
     that will automatically be sent to the server when 
     the form is submitted 
} 

そしてもちろんのは、対応する入力フィールドを持つことになり、その値は明らかに自動的にサーバーに送信されます。

最後にサーバー上でこの一意の識別子を使用して、フォームをレンダリングしたときにGETアクションでフェッチした場所の元の値を再フェッチします。あなたはどこかからそれらを取りました、そうでなければ、最初にViewDataにそれらを保存することができませんでした。

これらを削除して、ビューモデルを定義し、厳密に型指定されたビューを使用してください。私は、ASP.NET MVCアプリケーションで決して使用されるべきではない弱い型付けされた2つの構文に対して、実際のアレルギーを出すようになっています。

+0

セッションを使用せずに複数の状態と動的コンテンツのRESTfulな要求を維持しながら、あなたが提起したポイントには十分な理由がたくさんあります。モデルを使用する際にオブジェクトがビューデータにあることについて私は同意します。 – StuperUser

+0

@StuperUser、セッションについて何か言った?私が言ったのは、IDを追加し、このIDを使用してデータストア(/データベースなど)から値を取得することだけでした。セッションはまったくありません。私はWebアプリケーションのあらゆるセッションの大きな敵です。セッションを使用するのはRESTfulではないことに完全に同意してください。 –

+0

これらのデータが使用される方法(一部はId)は、毎回ディスクからデータを格納/取得することで、データベースを使用して状態を保持するSessionのエミュレーションになります。'otherProperty'はよく似ているので、新しいオブジェクトotherPropertyとそれ以外のSomeClassを返すように' SomeClass'を拡張すると意味があります。 – StuperUser