2011-10-29 9 views
0

私はWebフォームからMVCに移行しています(私は知っています、3年遅れています)、私は大部分を取得しますが、アドバイスが必要なことがいくつかありますそして明確化:ASP.NET MVC - 複雑なビューロジック

最初に、入力をビューに動的に追加する場合はどうなりますか?たとえば、古いWebフォームで請求書を作成する際に、サーバーサイドのクリックイベントハンドラを含むボタンがあり、追加の5つの請求書明細の行が追加されました。 Webフォームのステートフルな性質は、サーバーが残りのページを変更することなくPOSTイベントを「安全に」処理したことを意味していました。

MVCでは、クライアント側のスクリプト(showstopperではなく、スクリプトを有効にしていないクライアントをサポートしたいと思います)を使用せずにこれをどうやって行うのかとは思いません。

第2の問題は、請求書の例に関連しています。私のモデルにリストがある場合は、その入力をどのように生成する必要がありますか?

私はデータバインディングが可能な解決策であることを知っていますが、私は降伏制御のようなものです。

最後に、「ステートフルページ」のコンセプトに戻って、カレンダーを持つダッシュボードページがあるとします(独自のカレンダーコントロールクラスを作成しました。コントロール自体はステートレスですが、webform viewstateページング情報を保存する方法) - カレンダー月間にユーザーページをどのようにすることができますか?明らかにPOSTは不適切なので、クエリ文字列パラメータでGETする必要があります。これをMVCでどうやって行うことができますか? (AJAXは言わないでください)。

ありがとうございます!

答えて

2

であるかはよく分かりません。たとえば、クライアント側スクリプトを使用しない請求書に5行を追加したい場合は、インボイス生成のGETアクションに、行数に対してnull可能なintパラメータを使用させることをお勧めします。ページのビューモデルに現在の行数を格納し、現在の値よりも5以上のパラメータ値を設定したGETアクションへのリンクをページ上に生成します。ユーザーがリンクをクリックすると、GETビューは要求された行数のページを生成します。おそらく、また、クリックハンドラをインターセプトし、あなたの行動はそのためだろうスクリプトを経由して同じことを行いページにいくつかのスクリプトを追加します

@Html.ActionLink("Add 5 Lines", "invoice", new { rows = Model.CurrentRows + 5 }, new { @class = "add-rows" }) 

コントローラ

[HttpGet] 
public ActionResult Invoice(int? rows) 
{ 
     rows = rows ?? 5; // probably you'd pull the default from a configuration 
     ... 

     viewModel.CurrentRows = rows; 
     return View(viewModel); 
} 

見ます一般的なケースでは、ユーザーはサーバーへの往復を行う必要はありません。

<script type="text/javascript"> 
     $(function() { 
      $('.add-rows').click(function() { 
       ...add additional inputs to the invoice... 
       return false; // abort the request 
      }); 
     }); 
</script> 

カレンダーと同様です。一般的な考え方は、ビューから実行したいすべてのアクションを生成するのに十分な情報をビュー・モデルに入れることです。アクションを実行するために、リンクまたはフォームを構成します(複数のフォームを持つことができます)。パラメータを使用して、コントローラ/アクションと何を行う必要があるかを伝えます。まれに、アクション間で状態を保持する必要がある場合、たとえば、複数のアクションをとるウィザードを実行する場合、セッションに情報を格納したり、(セッションを使用する)TempDataを使用したりすることができます。あなたは、現在の日付と現在のビュータイプ(月/日/年)の必要があると思い、カレンダーのようなものについては

。これから、あなたを次の月/日/年に連れて行く行動を構築することができます。ページリストには、現在のページ、現在の並べ替えの列と方向、1ページあたりの項目数、およびページ数が必要です。あなたは、単に彼らが呼び出されるとパラメータについて正しいことを行い、それらのパラメータを期待してアクションにコールバックページングリンクを構築することができ、この情報を使用して。

最後には、それを受け入れ、AJAXを恐れないでください。常に適切なわけではありません(たとえば、ファイルをアップロードすることはできません)が、AJAX対応のインターフェイスがあれば分かります。

ユーザーが反復によって生成された入力を持っていたページにPOSTを行う場合
+0

おかげで、私はいくつかの質問を持っている:ユーザーがフォームにデータを入力した場合、その後、その後、彼らは入力した内容失うことになるより多くの行を追加することを決定、クライアントスクリプトを使用するが唯一の解決策はありますか?また、私のコントローラがそれを読むことができるように、POST中に新しく追加された行のコンテンツが私のモデルオブジェクトにどのように追加されますか? – Dai

+0

@David - 基本的な設計上の決定があります。私はおそらく、ユーザーがJSを有効にしていると仮定して、私が記述した方法で行う単純な解決策に行きます。 JSを有効にしていないユーザーは経験が低下しますが、JSをオンにするだけで体験を増やすことができます。それ以外の場合は、POSTアクションを「Add 5 Rows」* Submitボタン*に応答するより複雑なソリューションにします。クリックすると名前が付けられ、検出可能なパラメータとしてポストバックされ、ビューを再生成しますデータと余分な行。 – tvanfosson

0

MVCでは、さまざまな方法でアプリケーションの状態を保存できます。あなたのコントローラでは、Sessionオブジェクトに直接アクセスできます。また、データベースに状態を保存することもできます。

0

ビューには基本的な制御フローロジックが含まれるため、モデルにリストがある場合は、そのビューを反復処理したり、リスト内の各項目の入力コントロールをレンダリングすることができます。モデルの変数をビュー・ページの行の最大数に設定し、モデルで指定された数の表に行をレンダリングすることもできます。

ページングは​​基本的に同じものです。ページ番号をリンクとして表示する部分ビュー(Webフォームの世界ではユーザーコントロール)を作成できます。各リンクでは、そのページのデータを取得するアクションが呼び出されます。

私はあなたの牛肉はあなたのニーズに対応するためにあなたの行動を設計MVCでAJAXやJavaScript

+0

は、どのコントローラは、その情報を読み取るのですか?検証もどのように行うことができますか? Ta! – Dai

+0

モデル検証は、フレームワークhttp://www.asp.net/mvc/mvc3#BM_Model_Validation_Improvementsに組み込まれています。 コントローラはそれのパラメータの一つとして、項目のリストを受け取り、MVCモデルバインダーがポストされたデータを確実にする責任がある適切なリスト型に変換し、コントローラ – Jason

+0

に渡され、私は知っているが、私はどのようにすることができます意味動的に追加された入力のコンテキストでデータを取得し、検証しますか? – Dai

関連する問題