0

コントローラーからビューを表示し、そのユーザーが dropDownList で選択したものに依存して、別の異なるビューを元の呼び出しコントローラーに戻すことは可能ですか? 「デイジーチェーン」効果の一種。

この背後にある考え方は、ユーザーが車両タイプを選択することです - (ID 番号に関連付けられた) ビューで、選択されたものに応じてコントローラーに戻り、別のビューをレンダリングして、選択した車両タイプに応じて HTML をすぐに表示します。車、ボート、飛行機などのページ...

これが可能であれば、誰かが私にコード例を教えてもらえますか?

以下の実際のデータベース モデル - ただし、これはドキュメント用であり、車両用ではありません!

ここに画像の説明を入力

4

2 に答える 2

2

アクションメソッドのメソッドパラメータを確認し、それに基づいてさまざまなビューを返します。このようなもの。

public ActionResult GetInfo(string id,string vehicleTypId)
{
  if(String.IsNullOrEmpty(vehicleTypeId))
  {
    var vehicle=GetVehicleType(vehicleTypId);
    return View("ShowSpecificVehicle",vehicle)    ;
  }

  var genericVehicle=GetVehicle(id);
  return View(genericVehicle);

}

編集:そう言って、私はあなたがそれらを2つの別々のアクションメソッドに保つべきだと真剣に考えています。これにより、コードがクリーンで読みやすくなります。両方のアクションメソッドIDが必要な場合は、共通の機能を関数に移動して呼び出すことができます。だから私はこのようにそれをします

最初のページにViewModelがあると仮定します(すべての車両タイプを表示します)

public class VehicleTypesViewModel
{
  //other relevant properties
  public IEnumerable Types { set;get;}
  public int SelectedTypeId { set;get;}
}

初期ビューに対するGETリクエストは、このアクション結果によって処理されます。すべてのVehicleタイプを取得し、それをViewModelsTypesプロパティのビューに返します。

public ActionResult VehicleTypes()
{
  VehicleTypesViewModel objVM=new VehicleTypesViewModel();
  objVM.Types=dbContext.VehicleTypes.ToList();      
  return View(objVM);
}

そして、VehicleTypes.cshtmlと呼ばれるビューでは、

@model VehicleTypesViewModel     
@using(Html.BeginForm())
{
  @Html.DropDownListFor(Model.SelectedTypeId,new SelectList(Model.Types,"Text",Value"),"Select")
<input type="submit" value="Go" />

}

フォーム投稿を処理するための別のアクションメソッド。ここで選択したタイプIDがあり、ここで特定の詳細を取得して、別のビューを返すことができます

[HttpPost]
public ActionResult VehicleTypes(VehicleTypesViewModel model)
{
  // you have the selected Id in model.SelectedTypeId property
  var specificVehicle=dbContext.Vehicles.Where(x=>x.TypeId=model.SelectedTypeId);
  return View("SpecificDetails",specificVehicle);

}

または、RedirecToActionメソッドを使用して、特定の車両に対してGetリクエストを実行することもできます。PRGパターンに固執するため、このアプローチをお勧めします。

[HttpPost]
public ActionResult VehicleTypes(VehicleTypesViewModel model)
{
  int typeId=model.SelectedTypeId;
  return RedirectToAction("GetVehicle",new {@id=typeId});
}
public ActionResult GetVehicle(int id)
{
  var specificVehicle=dbContext.Vehicles.Where(x=>x.TypeIdid);
  return View(specificVehicle);

}

Javascriptを使用する場合: JavaScriptから新しいビューへのget呼び出しを行うこともできます。コントローラへのHTTPpostなし。そのために、最初のビューにJavaScriptを追加する必要があります

    @model VehicleTypesViewModel 
    //Include jQuery library reference here    
    @Html.DropDownListFor(Model.SelectedTypeId,new SelectList(Model.Types,"Text",Value"),"Select")
   <script type="text/javascript">
      $(function(){
        $("#SelectedTypeId").change(){
          window.location.href="@Url.Action("GetVehicle","Yourcontroller")"+"/"+$(this).attr("id");
        });
      });
   </script>
于 2012-05-14T15:42:16.900 に答える
0

より良いユーザーエクスペリエンスを得るために、を作成し、ajax呼び出しを介して同じページpartial viewのにその部分的なビューをロードすると思います。div

public ActionResult GetVehicalInfo(string id, string vehicleType)
{
    var vehicle = GetVehicleType(id, vehicleTypId);
    return PartialView("vehicle);      
}
于 2012-05-14T16:13:38.750 に答える