2012-02-08 15 views
1

私はドロップダウンリストをいくつか含むRazorビューを持っています。ドロップダウンの値の1つが変更された場合は、他のドロップダウンの値をクリアして新しい値を入れたいと思います。どの値を入れるかは、ビューが使用するモデルの値によって決まります。ビューからコントローラにモデルを送り返します。コントローラはまた、ビューにデータを返送することによってドロップダウンを変更できる必要があります。 Ajaxを使用したフォーム送信からコントローラに戻ってみたいと言っているわけではありません。私はAjaxを使用せずにフォーム送信を使用してコントローラに戻っています。MVC3/Razor to Controller Ajaxコール

誰かが私にいくつかの簡単なコードやこれを行う方法を示すためのいくつかのポインタを教えてください。私は個人的にこの状況を解決するためにViewBag &のViewDataを使用

おかげ

+0

部分ビューを使用する必要がありますか? –

答えて

3

コントローラー:

public ActionResult Index() 
{ 
    ViewBag.dd1value = default_value; 
    ViewBag.dd1 = DropDownlist1(); 
    ViewBag.dd2 = DropDownlist2(dd1value); 
    Return View(); 
} 

ビュー:最初のDropDownListで

のonchange JavaScriptを追加します。

<select onchange="javascript:this.form.submit();"> 
@foreach (var item in ViewBag.dd1) { 
    if (ViewBag.dd1value = item.dd1value) 
    { 
     <option selected value="@item.dd1value">@item.dd1text</option> 
    } 
    else 
    { 
     <option value="@item.dd1value">@item.dd1text</option> 
    } 
} 

次に、送信ボタンに名前を付けます。

<input type="submit" name="Genereate" value="Generate" /> 

コントローラでは、2つのActionResultを作成してデータを受信します。ドロップダウンリストの場合 :

[HttpPost] 
public ActionResult Index(int dd1value) 
{ 
    ViewBag.dd1value = dd1value; 
    ViewBag.dd1 = DropDownlist1(); 
    ViewBag.dd2 = DropDownlist2(dd1value); 
    Return View(); 
} 

提出するためのボタン:

[HttpPost] 
public ActionResult Index(int dd1value, int dd2value, FormCollection collection) 
{ 
    ViewBag.dd1value = dd1value; 
    ViewBag.dd2value = dd2value; 
    ViewBag.dd1 = DropDownlist1(); 
    ViewBag.dd2 = DropDownlist2(dd1value); 
    ViewBag.result = Result(dd1value, dd2value); 
    Return View(); 
} 

あなたはボタンを必要としない場合:

[HttpPost] 
public ActionResult Index(int dd1value, int dd2value) 
{ 
    ViewBag.dd1value = dd1value; 
    ViewBag.dd2value = dd2value; 
    ViewBag.dd1 = DropDownlist1(); 
    ViewBag.dd2 = DropDownlist2(dd1value); 
    ViewBag.result = Result(dd1value, dd2value); 
    Return View(); 
} 

注意してください、あなたがViewBag/ViewDataをを使用している場合、すべてのヘルプあなたはコンパイラから取得し、実行時のエラー/バグは、プロパティが「通常の」オブジェクト上にあり、コンパイラによって誤植がキャッチされた場合よりも発生する可能性が高くなります。

3

DragonZeldaとは別のソリューションを実装します。

私は、ビューがバインドするページに必要なデータを含むViewModelオブジェクトを作成します。

のように続いて、私は、そのモデルにバインドコントロールを作成します。x.SomeDDLSelected自動モデル自動的にドロップダウンリストで選択した値になるだろう、あなたのViewModelオブジェクトのプロパティになり

@Html.DropDownListFor(x => x.SomeDDLSelected, ......) 

バインダーは作用する。

public ActionResult MyAction(MyViewModelObject obj) 
{...} 

をそして、あなたは素晴らしく、きちんとすべてのデータは、すべての強い型付けを取得:

次に、それを完成させるために、コントローラのアクションはパラメータとしてあなたのViewModelオブジェクトを受け取ることになります。