2017-01-22 14 views
0

私は、クライアントがチェックボックスを使用して選択を行うことを希望する部分的な見解を持っています。次に、送信ボタンをクリックすると、選択したアイテムのIDがコントローラに送信されます。コントローラは確認ビューにリダイレクトされます。良い、シンプルで安全な解決策は何でしょうか?可能であればJavascriptを避けたいと思います。ありがとう!MVC選択されたチェックボックス項目をコントローラに部分ビューで渡す

VIEW

@model OrderTracking.Models.ViewModel.ItemDataView 

<div> 

@using (Html.BeginForm("VerifyItem", "ReserveItem", FormMethod.Get)) 
{ 
    //@Html.AntiForgeryToken() //TODO: Wire-up 
    <table class="table table-striped table-condensed table-hover"> 
     <thead> 
      <tr> 
       <th></th> 
       <th>Item ID</th> 
      </tr> 
     </thead> 
     <tbody> 

      @foreach (var i in Model.ItemProfile) 
      { 
       <tr> 
        <td>@Html.CheckBoxFor(r => i.IsSelected, new { @class = "checkbox" })</td> 
        <td>@Html.DisplayFor(r => i.ItemId)</td> 

       </tr> 
      } 
     </tbody> 
    </table> 



    @Html.ActionLink("Verify Order Information", "VerifyOrderInfo", "ReserveItem", "", new { @class = "btn btn-primary btn-large" }) 

} 

MODEL

namespace OrderTracking.Models.ViewModel 
{ 
public class ItemProfileView 
{ 
    [Key] 
    public int ItemId { get; set; } 
    public bool IsSelected { get; set; } 

} 

public class ItemDataView 
{ 
    public IEnumerable<ItemProfileView> ItemProfile { get; set; } 
} 

}

CONTROLLER

public ActionResult VerifyOrderInfo() 
    { 

     return View(); 

    } 
+0

'foreach'ループを使うことはできません - コレクションへのバインディングには[この回答](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)を参照してください。 (そして、あなたは 'ItemId'プロパティに隠れた入力を含める必要があります。 –

+0

リンクありがとうございますそれは本当に有益な情報です – Stormseye

答えて

1

これを実行する方法は多数あります。 リストに

@using (Html.BeginForm("VerifyOrderInfo", "ReserveItem", FormMethod.Post))

  • 変更IEnumerableをVerifyOrderInfo

    • 変更あなたのポストにフォームとアクション:あなたのコードへの最小の変更を必要とするものは、になりますインデックスでバインドすることができます。

      public List<ItemProfileView> ItemProfile { get; set; }

    • 今、あなたはインデックスで、チェックボックスを参照し、アイテムID

      @Html.CheckBoxFor(r => r.ItemProfile[i].IsSelected, new { @class = "checkbox" }) @Html.HiddenFor(r => r.ItemProfile[i].ItemId)

    • が代わりにActionLinkの

      <input type="submit" name="Verify Order Information" class="btn btn-primary btn-large" />

    • 送信ボタンを使用するために隠し入力を追加することができます
    • モデルをVに追加するフォームを送信するときに、それに対して

      public ActionResult VerifyOrderInfo(ItemDataView model)

    をコーディングすることができますので、erifyOrderInfoアクションは今ではアイテムIDとIsSelectedが移入ItemProfileリストにアクションにモデルを送信する必要があります入力項目を形成します。

  • +0

    簡単なステップバイステップで、全くわかりません。デフォルトのReserveItemコントローラの代わりにVerifyOrderInfoコントローラを呼び出すためにビューを取得するのに問題がある場合を除き、すべて動作するようですが、明日はそれに着きます。本当にありがとう! – Stormseye

    +0

    コードがReserveItemコントローラを呼び出そうとしています。アクションはBeginForm( "{action}"、 "{controller}"、...)で最初に実行されます。 – fcs

    +0

    すみません。私は間に合わなかった。私は、VerifyOrderInfo POSTアクションの代わりにReserveItem GETアクションを呼び出すと言っていました。両方のアクションはReserveItemコントローラーにあります。 VerifyOrderInfoビューを作成しました。アドレスバーに直接パスを入力しようとすると、「サーバーエラー/アプリケーション - リソースまたはその依存関係の1つが見つかりません」というメッセージが表示されます。しかし、私がViewOrderInfoアクションをPostの代わりに取得するように変更すると、ページテンプレートが読み込まれます(もちろん、データはありません)。 – Stormseye

    関連する問題