2011-01-31 5 views
6

こんにちは、ASP.NET MVC 2と隠し値としてリストしますか?

私はリストが含まれているViewクラスを持って、このリストには、ユーザーがアップロードした利用可能なファイル(HTMLヘルパーでレンダリング)を説明しています。私は、ビューに以下を追加した提出でこのデータを維持するには

<%: Html.HiddenFor(model => model.ModelView.Files)%> 

を私はmode.ModelView.Filesリストが提出上のアクションに返されることを期待していたが、それはないですか?

隠しフィールドとしてリストを持つことはできませんか?

詳細情報:ユーザーが保存されて持ち運びにくいがGUIDとして参照され、保存画像をレンダリングするためにユーザに返送され、このリストでされているサービス、上に保存されたファイルのカップルを提出します。ユーザーがフォーム内でいくつかの変更を加えて、もう一度submitを押すと、コントロールアクションに入るときに画像リストが空になるのですが、なぜですか?

BestRegards

答えて

6

のHiddenFieldとしてリストを持つことが可能ではないですか?

もちろん不可能です。隠しフィールドには1つの文字列値しかありません。

<input type="hidden" id="foo" name="foo" value="foo bar" /> 

リストが必要な場合は、リストの各項目に対して複数の非表示フィールドが必要です。これらのアイテムが複雑なオブジェクトの場合、リストの各アイテムの各プロパティには非表示のフィールドが必要です。

<input type="hidden" id="filesId" name="filesId" value="123" /> 

とあなたのコントローラのアクションで、あなたが最初にそれを得たどこからあなたのコレクションを再フェッチするために、この一意の識別子を使用します。

または、はるかに簡単な解決策は、いくつかのユニークな識別子を表すために、この隠しフィールドのためです。

Sessionにモデルを保存することもできます(私の回答酒の完成度についてはセッションを言いますが、実際に使用することはお勧めしません)。

+0

なぜあなたはセッションをお勧めしませんか?行動の間にデータを保存するためのあなたの推薦は何ですか?どのようにユニーク識別子を取得する必要がありますか? – Banshee

+1

@SnowJimでは、データはすでにデータベースに保存されています。そのため、データベースに照会してデータを再取得するだけです。もちろん、各リクエストでデータベースにアクセスするのを避けるために、キャッシングなどを使用することができます。セッションを避けるために、ステートフルでスケーラビリティの低いアプリケーションが必要です。たとえば、デフォルトでセッションはメモリに格納されており、サーバーファームで実行している場合は、他のストレージ(アウトオブプロセスまたはSALサーバー)にオフロードする必要があります。 –

3

私がこれを始める前に、これは解答としてマークされた提案された解決策の1つの例であると言いたいと思います。ダーリンはそれを正しくしました。ここに提案されたソリューションの実装の例があります。

私は、タイプintの一般的なリストを隠しフィールドに格納する必要があったのと同じ問題がありました。私は標準的なapporachをしようとした:

<%: Html.HiddenFor(foo => foo.ListOfIntegers) %> 

それはしかし、それが原因で例外です。だから私は、ダリンの提案を試してみましたが、これに上記のコードを置き換える:

<% 
foreach(int fooInt in Model.ListOfIntegers) 
{ %> 
<%: Html.Hidden("ListOfIntegers", fooInt) %> 
<% } %> 

これは私にとって魅力のように働きました。 Darrinに感謝します。

関連する問題