2016-04-06 20 views
1

Benim sql veritabanı tablosu tarafından doldurulur benim görünümünde açılan kutusu var. aşağı açılırken farklı değerlerim var, düğmenin tıklatıldığında seçilen değerinin denetleyici eylemi yöntemine geçmek istiyorum. burada aşağı açılan nüfus açılır.Bir mvc görünümünden denetleyici eylem yöntemine açılan açılır kutudaki değer nasıl iletilir?

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 }); 
     } 

ve nihayet sepeti sınıfı aşağıdaki gibidir::

@Html.DropDownList("AV") 

benim denetleyicisi eylem yöntemidir: görünümünde

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); 
     } 

ve sonra

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; 
      } 
     } 

denedim Error with the ajax and transaction in mvc ama yoktu şans, herhangi bir fikir?

Sir Rion Williams için düzenleme: Daha fazla bilgi için tüm cart sınıfı aşağıdadır. senin Görünüm aşağıdaki elemanı içeriyorsa

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; } 
     } 
    } 

cevap

0

:

@Html.DropDownList("AV") 

Bu, sunucuya bu gönderiyorsunuz ancak bir modele AV denilen açık bir parametre veya bir mülk ya bekliyor gerekir demektir Bu adlandırılmış AV bağlı ediliyor: En cart ob eğer

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 
} 

, bu yaklaşımı göz ardı edebilirsiniz Ject, MVT otomatik olarak bağlanacağı için zaten AV olarak adlandırılmış bir özelliğe sahiptir.

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

: Bu değeri göndermek isterse

Olmayan AJAX Örnek

Örnek amacıyla, size açılır menüsü AddToCart() eylem işaret ve içeren bir <form> unsuru oluşturabilir Gönder düğmesini tıklattığınızda, buAddToCart() eyleminizin değerlerini POST olur ve AV özelliğini seçili değerine bağlar:

// 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 Örnek

AJAX örneği önceki yönteme çok benzer çalışır, ancak <form> kendisi aslında gönderildiği nasıl farklıdır.jQuery kullanıyorsanız, sen, submit olayı yakalamak için bir etkinlik kadar Tel bunu görmezden ve elle AJAX içeriğini POST olabilir: sizin AddItem() yöntemde,

<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> 

Ayrıca, nerede görmüyorum senin lineCollection değişken tanımlanır ve else fıkra şey yürütülürse gerçekten olacağını belirtmek gerekir: bunun için

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

Rion sayesinde, ama net kadarıyla ben mvc oldukça yeni olduğum gibi bunu biraz yapmak mümkündür ? AV adlı bir mülküm yok ve ne bir parametre tavsiye edersiniz? –

+0

Değerinizi gönderip göndermediyseniz basitçe "kontrol et" seçeneği, "AV" değerini kontrol etmek için sepete ekle yöntemine bir satır ekleyebileceğinizdir: var seçili = İstek ["AV" ]; '. Bu değerin düzgün bir şekilde doldurulup doldurulmadığını görmek için hata ayıklayıcısını kullanabilir ve sonra gerektiği gibi kullanabilirsiniz. Alternatif olarak, daha önce bahsettiğim yaklaşımı, aslında “AV” adlı eylemde bir parametre ekleyerek ve MVC'nin değeri kendi başına bağlamayı ele alacağını kullanabilirsiniz. –

+0

Sir Williams, soruyu bir kez daha gözden geçirebilirseniz, 'geçit' parametresinden geçirmiş olduğum parametre bir hatayı gösterir ve hatada bir soru yazılır. tekrar teşekkürler –

İlgili konular