2012-03-02 4 views
0

をコントローラへのビューからのデータを渡す私は、JSONデータを返すアクションメソッドを介してデータの一部のビットを取得し、表示しています。 選択したオプションの組み合わせに応じて、ユーザーはページの一部のフィールドを入力できます。 データをコントローラに戻して保存するには、どのような方法が最適ですか?は、アクション

  • データを含むフィールドは、選択したオプションによって異なります。
  • Viewにバインドされたすべてのフィールドを持つViewModelオブジェクトがありません。

    @Ajax.BeginForm("MyAction", null, new AjaxOptions 
          { 
          }, new { @id = "SaveForm" }) 
    { 
        ..... 
        @Html.RadioButton("SomeRadioButton", "bla", false, new { @id = "SomeRadioButton" }) 
        ..... 
        @Html.TextArea("SomeTextArea", new { @id = "SomeTextArea" }) 
        ..... 
        <a href="#" onclick="$('#SaveForm').submit();">Save</a> 
    } 
    

    私はアクションでこれらの制御値のすべてを取得するにはどうすればよい:私はこれを持っている時点では

私のような何かを追加することができます

public void MyAction(FormCollection form) 
{ 
    ......... 
} 

しかし、私は本当にこのオプションは好きではありません。 これを実装する最もクリーンな方法は何ですか?事前

おかげ

答えて

3

あなたはビューモデル定義することができます。

public class MyViewModel 
{ 
    public string SomeRadioButton { get; set; } 
    public string SomeTextArea { get; set; } 

    ... 
} 

をしてからコントローラのアクションは、引数として、このビューモデルを取る必要があり、デフォルトのモデルバインダーを残すには、その仕事をする:

[HttpPost] 
public void MyAction(MyViewModel model) 
{ 
    ... 
} 

I希望も強く型付けされたヘルパーのバージョンを使用するために、ビュー内のこのビューモデルを利用してください:

@Ajax.BeginForm("MyAction", null, new AjaxOptions { }, new { @id = "SaveForm" }) 
{ 
    @Html.RadioButtonFor(x => x.SomeRadioButton) 
    ... 
    @Html.TextAreaFor(x => x.SomeTextArea) 
    ... 
    <button type="submit">Save</button> 
} 
+0

私はモデルのバインダーなしでこれをやろうとしていましたが、ビューからすべてのデータを収集する方法がバインダーを通過する必要があります。ここでちょっと試す;) – Dante

+0

@Dante、いいえ、必要ありません。必要ならばFormCollectionを使うことができます(おそらく望みません)。値を取得するためのコントローラアクションでは、 'form [" SomeTextArea "]'を使用します。もちろん、これは文字列として値を返します。基礎となるデータ型に解析し、手動で検証を実行するのはあなた次第です。既定のモデルバインダーによって既に処理されているものです。 –

+0

したがって、検証とデータ型が重複して選択される主な理由です。ありがとうダーリン! – Dante

1

あなたは(そしてほとんど必要があります)すべてのフィールドを保持するであろう、このためにカスタムクラスを使用することができます。 Model Bindingについてさらに読む - MVCでそれを行う方法です。