2016-04-06 30 views
1

私はSQLデータベーステーブルで満たされた私のビューにドロップダウンボックスを持っています。ドロップダウンで私は別の値を持って、私はボタンのクリックでコントローラのアクションメソッドにドロップダウンの選択値を渡したいと思います。ドロップダウンがどのように設定されているかを示します。mvcビューからコントローラアクションメソッドにdropdownboxの選択した値を渡すにはどうすればいいですか?

public ActionResult AddToCart(Cart cart, int productId, string returnUrl, string size) 
     { 
      Product product = repository.Products 
         .FirstOrDefault(p => p.ProductID == productId); 
      if (product != null) 
      { 
       cart.AddItem(product, 1,size); //no overload for method 'AddItem' takes 3 argument, Error! 
      } 
      return RedirectToAction("Index", new { returnUrl }); 
     } 

、最終的には、カートクラスは以下の通りです:

@Html.DropDownList("AV") 

私のコントローラのアクションメソッドは次のとおりです。ビューで

public ViewResult ProductDetails(int productId) 
     { 
      Product product = repository.Products 
       .Include(p => p.Reviews) 
       .FirstOrDefault(p => p.ProductID == productId); 
      List<string> available = new List<string>(); 
      available.AddRange(product.AvailableSizes.Split(',').ToList()); 
      ViewData["AV"] = new SelectList(available); 
      return View(product); 
     } 

、その後

public void AddItem (Product product, int quantity) 
     { 
      CartLine line = lineCollection 
       .Where(p => p.Product.ProductID == product.ProductID) 
       .FirstOrDefault(); 
      if (line == null) 
      { 
       lineCollection.Add(new CartLine { Product = product, Quantity = quantity }); 
      } 
      else 
      { 
       line.Quantity += quantity; 
      } 
     } 

私が試しましたError with the ajax and transaction in mvc運、どんな考え?

リオン・ウィリアムズの編集: 詳しいカートのクラスは以下のとおりです。あなたのビューには、以下の要素が含まれている場合

public class Cart 
    { 
     private List<CartLine> lineCollection = new List<CartLine>(); 
     public void AddItem (Product product, int quantity) 
     { 
      CartLine line = lineCollection 
       .Where(p => p.Product.ProductID == product.ProductID) 
       .FirstOrDefault(); 
      if (line == null) 
      { 
       lineCollection.Add(new CartLine { Product = product, Quantity = quantity }); 
      } 
      else 
      { 
       line.Quantity += quantity; 
      } 
     } 
     public void RemoveLine (Product product) 
     { 
      lineCollection.RemoveAll(l => l.Product.ProductID == product.ProductID); 
     } 
     public decimal ComputeTotalValue() 
     { 
      return lineCollection.Sum(e => e.Product.ProductPrice * e.Quantity); 
     } 
     public void Clear() 
     { 
      lineCollection.Clear(); 
     } 
     public IEnumerable<CartLine> Lines 
     { 
      get { return lineCollection; } 
     } 
     public class CartLine 
     { 
      public Product Product { get; set; } 
      public int Quantity { get; set; } 
     } 
    } 

答えて

0

@Html.DropDownList("AV") 

これは、あなたのサーバにこれを掲示しているがモデルにAVと呼ばれる明示的なパラメータまたはプロパティのいずれかを期待する必要があることを意味しそれはAVという名前にバインドされている:

public ActionResult AddToCart(Cart cart, int productId, string returnUrl, string size, string AV) 
{ 
    // AV should be populated as long as you are properly serializing 
    // the <form> with the "AV" element in it and it should store the 
    // selected value 
} 

あなたcart OB場合は、このアプローチを無視することができますMVCが自動的にそれをバインドするので、jectにはすでにAVという名前のプロパティがあります。

<form action='@Url.Action("AddToCart","YourController")' method='post'> 
     @Html.DropDownList("AV") 
     <input type='submit' value='Add to Cart' /> 
</form> 

:あなたはこの値を提出したい場合

非AJAX例

例示の目的のために、あなたはあなたのドロップダウンをごAddToCart()行動を指すと含まれてい<form>要素を作成することができます送信ボタンをクリックすると<form>の値がAddToCart()になり、AVプロパティが選択された値にバインドされます:

// The [HttpPost] decorator allows this to accept POST requests 
[HttpPost] 
public void AddToCart(string AV) 
{ 
    // You should be able to see your selected value here (example) 
    var selected = AV; 
} 

AJAX例

AJAXの例では、従来の方法に非常によく似ていますが、<form>自体が実際に掲載される方法が異なります。あなたはjQueryのを使用している場合、あなたは、submitイベントをキャプチャするためのイベントを配線し、それを無視して、手動でAJAXを経由してコンテンツをPOSTできます

<form action='@Url.Action("AddToCart","YourController")' method='post'> 
     @Html.DropDownList("AV") 
     <input type='submit' value='Add to Cart' /> 
</form> 
<script> 
     $(function(){ 
      $('form').submit(function(e){ 
       // Ignore any default behavior/submission 
       e.preventDefault(); 
       // Make an AJAX post to your action (short-hand) 
       $.post('@Url.Action("AddToCart","YourController")', $(this).serialize(), function(){ 
         alert('Your value was posted successfully!'); 
       }); 
      }); 
     }); 
</script> 

また、あなたのAddItem()方法では、私はどこlineCollection表示されません変数が定義され、else句が実行された場合、何も実際に起こらないことに留意すべきである。そのため

public void AddItem (Product product, int quantity) 
{ 
     // Create an instance of your line 
     var line = lineCollection.FirstOrDefault(p => p.Product.ProductID == product.ProductID); 
     if (line == null) 
     { 
      // Is lineCollection some global or static variable? 
      lineCollection.Add(new CartLine { Product = product, Quantity = quantity }); 
     } 
     else 
     { 
      // Since line is actually created (and scoped) to this 
      // method, this really isn't going to do anything 
      // as line will be disposed of upon exiting this method 
      line.Quantity += quantity; 
     } 
} 
+0

リオンのおかげで、それは私の知る限りは、MVCにはかなり新しいですと、それは少し明確にすることができます?私はAVと呼ばれるプロパティを持っておらず、あなたは何を助言しますか? –

+0

あなたの値が投稿されているかどうかを単にチェックするのが最も簡単なことは、あなたのadd to cartメソッドの中に 'AV'の値を次のようにチェックする行を追加できるということです:' var selected = Request ["AV" ]; '。デバッガを使用して、その値が正しく設定されているかどうかを確認し、必要に応じて使用することができます。あるいは、前述のアプローチを使用して、実際にAVと呼ばれるアクションにパラメータを追加することができます。MVCは独自の値のバインドを処理します。 –

+0

サーウィリアムズは私の質問をもう一度見てもらえますか?私のアクションメソッドに渡されたパラメータ 'size'はエラーを表示し、エラーは質問に書かれています。もう一度ありがとうございます –

関連する問題