2016-04-06 7 views
1

Ich habe Dropdown-Box in meiner Ansicht, die von der SQL-Datenbank-Tabelle gefüllt ist. Im Drop-Down-Menü habe ich verschiedene Werte, ich möchte den ausgewählten Wert des Dropdown-Menüs bei Klick auf die Controller-Aktionsmethode übergeben. Hier ist, wie Drop-Down gefüllt ist.Wie übergibt man den ausgewählten Wert der Dropdown-Box von einer MVC-Ansicht an die Controller-Aktionsmethode?

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

und dann in der Ansicht:

@Html.DropDownList("AV") 

meine Controller-Aktion Methode ist:

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

und schließlich die Karre Klasse ist unten:

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

ich versuchte, Error with the ajax and transaction in mvc hatte aber keine Glück, irgendeine Idee?

Bearbeiten für Sir Rion Williams: Die gesamte Wagenklasse ist unten für Ihre weitere Informationen.

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

Antwort

0

Wenn Ihre Ansicht das folgende Element enthält:

@Html.DropDownList("AV") 

Dies bedeutet, dass aber Sie dies Ihrem Server veröffentlichen müssen entweder einen expliziten Parameter AV oder eine Eigenschaft auf einem Modell namens erwartet werden dass wird zu dem Namen AV gebunden:

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 
} 

Sie diesen Ansatz ignorieren können, wenn Ihr cart ob ject hat bereits eine Eigenschaft namens AV, da MVC sie automatisch bindet.

Nicht AJAX Beispiel

Zum Beispiel Zwecke, wenn Sie diesen Wert einreichen wollten, könnten Sie ein <form> Element erstellen, die auf Ihre AddToCart() Aktion Punkte und enthält Ihre DropDown:

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

Wenn Sie auf die Senden-Schaltfläche klicken, würde dies POST die Werte Ihrer <form> Aktion AddToCart() und es würde die AV Eigenschaft an den ausgewählten Wert binden:

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

Das AJAX Beispiel funktioniert sehr ähnlich wie das vorherige Verfahren, unterscheidet sich aber dadurch, wie die <form> selbst tatsächlich gebucht wird.Wenn Sie jQuery verwenden, könnten Sie ein Ereignis verdrahten das submit Ereignis zu erfassen, ignorieren und POST manuell den Inhalt via AJAX:

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

Zusätzlich in Ihrer AddItem() Methode, ich sehe nicht, wo Ihr lineCollection Variable definiert ist, und es sollte beachtet werden, dass, wenn die else Klausel nichts ausgeführt wird, wird wirklich passieren:

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 dank für das, aber ist es möglich, es ein wenig klar wie weit zu machen, wie ich bin ganz neu zu mvc ? Ich habe keine Eigenschaft namens AV und weder einen Parameter, was raten Sie? –

+0

Nun die einfachste Sache, einfach zu überprüfen, ob Ihr Wert veröffentlicht wird oder nicht, ist, dass Sie eine Zeile innerhalb Ihrer Add-to-Cart-Methode hinzufügen können, um den 'AV'-Wert wie folgt zu überprüfen:' var selected = Request ["AV" ]; '. Sie können den Debugger verwenden, um festzustellen, ob dieser Wert korrekt ausgefüllt wird, und ihn dann nach Bedarf zu verwenden. Alternativ könnten Sie den Ansatz, den ich bereits erwähnt habe, verwenden, um der Aktion namens AV einen Parameter hinzuzufügen, und MVC würde den Wert selbständig binden. –

+0

Sir Williams, bitte schauen Sie sich meine Frage nochmal an. Der Parameter 'Größe', den ich in meiner Aktionsmethode übergeben habe, zeigt einen Fehler und der Fehler ist in der Frage geschrieben. Vielen Dank nochmal –

Verwandte Themen