2011-07-13 12 views
2

ドロップダウンリストまたはVenue Map [すぐにドロップダウンリストを表示する]を使用してユーザーにシーティングエリアを選択させたい ユーザーが座席エリアと送信ボタンを押すと、私は彼らが選択した座席エリアのテーブルを別のビューをロードしたいと思います。ここでMVC3 - Razor - ビューまたはドロップダウンリスト間でデータを転送

はシーティングエリアとテーブル[テーブル]のためのデータモデル.EDMXの一部である(関係が設定されているだけお見せします。)

EDMX Model

私はMVC3先物シリアル化を試してみました - 私が望むように動作させることができませんでした

ウェブサイトでこの例を見てから、KnockoutJSを調べました:http://knockoutjs.com/examples/cartEditor.htmlカテゴリを選択すると、その横のドロップダウンリストで製品が変わる方法を教えてください。 (この方法は今のところうまくいくだろうが)データからどのようにデータを取り込むのか例から分かりません。

最終的に2つのビューが必要です。テーブルの選択)

レイザービュー - ユーザー最初のビューを取得するには、[割り当て表]をクリックします(ビュー#1)

Click Assign Table

ビュー#1:選択してくださいシーティングエリア ドロップダウンで、このかみそりビューを生成[コントローラコード]

public ActionResult AddTableTo(int id) 
     { 
      var tableService = id; 
      var tableServiceName = db.VipServices.Single(x => x.VipServiceId == id); 
      var venueId = tableServiceName.Event.Venue.VenueId; 
      ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName; 
      ViewData["TableServiceFor"] = tableService; 

      ViewBag.SeatingAreaId = new SelectList(db.SeatingAreas.Where(y => y.VenueId == venueId), "SeatingAreaId", "AreaName"); 

      return View(); 
     } 

:私は最終的にこの示す会場の地図にするつもりです

View1 with drop-down

異なるレベルと座席エリアがあります。

座席エリアを選択した後...前のビューからデータ(SeatingAreaID)を保持している別のビューにリダイレクトするか、座席エリアの選択を非表示にしてその座席エリアにテーブルを表示します。

[一部コントローラーコードビューのための#2]

ViewBag.TableId = new SelectList(db.Tables.Where(y => y.SeatingAreaId == seatingAreaId), "TableId", "TableName"); 

私はこれをヘンデルするための最良の方法は何か教えてください。私はこの1つ以上のことをこれ以上使用すると確信しています。おそらく、行う方法を知ることは非常に貴重です。

これは非常に簡単なことかもしれませんが、私は好きなようにこれを行う方法については何も見つけることができません。そして、SeatingAreaIDは私がビュー間で転送したいと思う唯一の変数ではなく、私はVenueIDを保持する必要があります& VipServiceIDはテーブルの選択の終わりにも、コントローラが多対多テーブルとVipServiceの関係を確認し、VipService Detailsページにリダイレクトします。

ありがとうございました。 Tim

答えて

1

私は先に進み、私が知っている唯一の方法でした。恐らく最良の方法ではありませんでしたが、うまくいきました。誰かがこれを達成するためのより良い方法を持っている場合私に知らせてください。

ユーザーが[テーブルの追加]ボタンを選択した後:私がやったこと

[制御装置1A]

public ActionResult AddTableTo(Int64 id) 
     { 
      var tableService = id; 
      var tableServiceName = db.VipServices.Single(x => x.VipServiceId == id); 
      var venueId = tableServiceName.Event.Venue.VenueId; 
      ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName; 
      ViewData["TableServiceFor"] = tableService; 

      ViewBag.SeatingAreaId = new SelectList(db.SeatingAreas.Where(y => y.VenueId == venueId), "SeatingAreaId", "AreaName"); 

      return View(); 
     } 

[ビュー#1]

@model ShadowVenue.ViewModels.VipSeatingAreaViewModel 
@{ 
    ViewBag.Title = "Select Seating Area"; 
} 

<h2>Select Seating Area For:</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    <fieldset> 
     <legend>@ViewData.Eval("TablerServiceNameFor")'s Table(s)</legend> 

     <div class="editor-label"> 
      Select Seating Area 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("SeatingAreaId", String.Empty) 
     </div> 
     @Html.Hidden("VipServiceId", ViewData.Eval("TableServiceFor")) 
     <p> 
      <input type="submit" name="nextButton" value="Next" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to Table Service Details", "Details", new { Id = ViewData.Eval("TableServiceFor") }) 
</div> 

[コントローラ1bのコントローラ1Bは、処置AddTableToTable [コントローラ2]にリダイレクトし、送信

[HttpPost] 
[Authorize(Roles = "Administrator, SuperUser")] 
public ActionResult AddTableTo(VipSeatingAreaViewModel seatingArea, string nextButton) 
{ 
    if (nextButton != null) 
     return RedirectToAction("AddTableToTable", new { sid = seatingArea.SeatingAreaId, vid = seatingArea.VipServiceId }); 
    return View(seatingArea); 
} 

選択されたSeatingAreaIdとVipServiceIdに沿って

[コントローラ2]

public ActionResult AddTableToTable(Int16 sid, Int64 vid) 
     { 
      var tableService = vid; 
      var tableServiceName = db.VipServices.Single(x => x.VipServiceId == vid); 
      var seatingAreaId = sid; 
      var seatingArea = db.SeatingAreas.Single(x => x.SeatingAreaId == sid); 

      ViewData["TablerServiceNameFor"] = tableServiceName.Customer.FullName; 
      ViewData["TableServiceFor"] = tableService; 
      ViewData["SeatingAreaName"] = seatingArea.AreaName; 

      ViewBag.TableId = new SelectList(db.Tables.Where(y => y.SeatingAreaId == seatingAreaId), "TableId", "TableName"); 

      return View(); 
     } 

を見る#2 [ビュー#2]

@model ShadowVenue.ViewModels.VipTableViewModel 
@{ 
    ViewBag.Title = "Select Table"; 
} 

<h2>Select Table For:</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    <fieldset> 
     <legend>@ViewData.Eval("TablerServiceNameFor")'s VIP Service</legend> 

     <div class="editor-label"> 
      Select Table in the <b>@ViewData.Eval("SeatingAreaName")</b> Seating Area 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("TableId", String.Empty) 
     </div> 
     @Html.Hidden("VipServiceId", ViewData.Eval("TableServiceFor")) 
     <p> 
      <input type="submit" name="backButton" value="Back" /> 
      <input type="submit" name="nextButton" value="Next" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to Table Service Details", "Details", new { Id = ViewData.Eval("TableServiceFor") }) 
</div> 

をレンダリングし、私は、ユーザーにさまざまなシーティングエリアを選択するために戻ってまたは選択するためのオプションを与えますVIPサービスに追加するテーブル。ビューポストを[コントローラ2b]に選択すると、VipServiceとテーブルの多対多関係が追加されます。

[コントローラ部2b]

[HttpPost] 
     [Authorize(Roles = "Administrator, SuperUser")] 
     public ActionResult AddTableToTable(VipTableViewModel model, string backButton) 
     { 
      if (backButton != null) 
      { 
       return RedirectToAction("AddTableTo", new { id = model.VipServiceId }); 
      } 

      if (ModelState.IsValid) 
      { 
       VipService v = db.VipServices.Single(x => x.VipServiceId == model.VipServiceId); 
       Table t = db.Tables.Single(x => x.TableId == model.TableId); 
       v.Tables.Add(t); 

       db.SaveChanges(); 
       return RedirectToAction("Details", new { id = model.VipServiceId }); 
      } 

      else 
      { 
       return View(model); 
      } 

     } 

は最終的に私は、ユーザーがちょうど彼らが割り当てたいエリアやテーブルに触れて(クリック)することができますので、会場のビジュアルにドロップダウンリストを作るつもりです。

もう一度、誰かがより良い解決策を持っている場合は、私に知らせてください。

ありがとうございます。

0

まず、ViewDataディクショナリプロパティの使用をやめて、コントローラからビューにデータを渡すことをお勧めします。 ViewDataを使用できるときはいつでも、ViewModelを使用することもできます。 ViewModelを使用すると、キーを辞書に渡すのではなく、コンパイラが役立ちます。

良い読み取りがここで見つけることができます:http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx

あなたは簡単にビューへのビューからデータを移動することができるはずのViewModelパターンを使用して快適になった後。

+0

私は既にViewModelのセットアップを行っていますが、私はその記事が私が求めていることとは何か関係がないことを知りません。 –

関連する問題