2017-11-22 28 views
0

私はAsp.Net Core 2.0 MVCで簡単なショッピングカートアプリを作ろうとしています。私はAjaxingをやっていません。私はカートとCartItemを更新したい、下の2つのビューのいずれかのいずれかからモデルデータをビューのテーブルとは異なるテーブルに保存するにはどうすればよいですか?

public class Product 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Info { get; set; } 
    public decimal Price { get; set; } 
} 

public class Cart 
{ 
    public int Id { get; set; } 
    public int CartItemId { get; set; } 
    public int CustomerId { get; set; } // not in use yet 
} 

public class CartItem 
{ 
    public int Id { get; set; } 
    public int ProductId { get; set; } 
    public int NumEach { get; set; } // not in use yet 
} 

、再び、私はカートに追加]ボタンをクリックしたビューにリダイレクトされます:私は三つのモデルを持っている

1)インデックスビュー:

@model IEnumerable<simpleShop.Models.Product> 

<table class="table"> 
    <thead> 
     <tr> 
      <th>@Html.DisplayNameFor(model => model.Title)</th> 
      <th>@Html.DisplayNameFor(model => model.Info)</th> 
      <th>@Html.DisplayNameFor(model => model.Price)</th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        <a asp-action="Details" asp-route-id="@item.Id"> 
         @Html.DisplayFor(modelItem => item.Title) 
        </a> 
       </td> 
       <td>@Html.DisplayFor(modelItem => item.Info)</td> 
       <td>@Html.DisplayFor(modelItem => item.Price)</td> 
       <td> 
        <form asp-action="AddToCart"> 
         <button type="submit" value="@item.Id">Add to cart</button> 
        </form> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

2)詳細ビュー:

以下
@model simpleShop.Models.Product 
@{ 
    ViewData["Title"] = Html.DisplayFor(model => model.Title); 
} 
<h2>@Html.DisplayFor(model => model.Title)</h2> 
<h4>@Html.DisplayFor(model => model.Info)</h4> 
<h1>@Html.DisplayFor(model => model.Price)</h1> 
<form asp-action="AddToCart"> 
    <input type="hidden" asp-for="Id" /> 
    <p> 
     <input type="submit" value="Add to cart" /> 
    </p> 
</form> 
<div> 
    <a asp-action="Index">Return to list</a> 
</div> 

私の障害のあるAddToCart-Metで現時点ではカートやカートテーブルにデータを保存するために何もしていません。どうすれば入手できますか?一つのことバインド(のための

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> AddToCart([Bind("Id")] Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     _context.Add(product); 
     await _context.SaveChangesAsync(); 
     if (product.Id > 0) // added to cart via the details-view 
     { 
      return RedirectToAction("Details", "Home", product.Id); 
     } 
     else // added to cart via the index-view 
     { 
      return RedirectToAction(nameof(Index)); 
     } 
    } 
    return View(product); 
} 
+0

現在、正確に何が起こっていますか?それはAddToCartアクションに入っていますか?あなたはデバッグで流れをチェックするためにそれを実行しましたか? – Aeseir

+0

AddToCartアクションは実行されていますが、データを受信しません。しかし、今のように、CartテーブルとCartItemテーブルではなくProductテーブルに書き込むように設定されています。私がProductの代わりにCartItemと言うアクションメソッドを変更すると、NumEachに0、ProductIdに0がCartItemテーブルに保存され、IdなしでHome/Detailsにリダイレクトされるので、404が発生します。私がそれを変更した場合、product.Id(またはcartItem.ID、それは問題ではありません)が> 0であれば、Home/Details + Idにリダイレクトされます。 – Stian

答えて

0

)新しいアクションに渡したい物の問題のすべてのプロパティを含める必要があり、これまで何をバインドしたい覚えて、単に「ID」以外の方法より多くを必要とします。行の

参照コメント - >>

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> AddToCart([Bind("Id")] Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     _context.Add(product); //**BAD this will probably try to 
           // add product to the product table again.** 
           // With error to follow about already exists 
           // exception at the SaveChangesAsync call. 
     await _context.SaveChangesAsync(); 

     if (product.Id > 0) 
     { 
      return RedirectToAction("Details", "Home", product.Id); 
     } 
     else // added to cart via the index-view 
     { 
      return RedirectToAction(nameof(Index)); 
     } 
    } 
    return View(product); 
} 

私の提案は、あなたががカートと製品ののProductIdと数量(あなたNumEach)

[HttpPost] 
[ValidateAntiForgeryToken] 
public asyync Task<IActionResult> AddToCart([Bind("ProductId", "NumEach", "CartId")] CartItem model, string ReturnUrl){ 
    if(ModelState.IsValid){ 

     _context.CartItem.Add(model); 

     await _context.SaveChangesAsync(); 

     //model.Id greater than 0 indicates a save occurred. 
     if(model.Id > 0) 
      return RedirectToAction(ReturnUrl); // forced return for further shopping? 
     else 
      return RedirectToAction("Index");  
    } 

    //this assumes bad model state with no error unless model is 
    //annotated accordingly. 

    return View(model); 
} 

問題を持っています、これらの線に沿って行きます今すぐ1アイテムしか収納できません...

public class Cart{ 
    public Cart(){} 


    public int Id {get;set;} //cart's integer id 

    public List<CartItem> CartItems {get;set;} //collection of cartitems 

    //FK 
    public int CustomerId {get;set;} //customer's id 
    //NAV 
    public Customer CustomerId {get;set;} //customer nav 
    ... 
} 

public class CartItem{ 
    public CartItem(){} 

    public int Id {get;set;}   //cart item id 

    public int ProductId {get;set;} //productid 
    public Product Product {get;set;} //nav property 

    public int NumEach {get;set;}  //quantity of each product 

    //FK 
    public int CartId {get;set;}  //Foreign Key 
    //NAV 
    public Cart Cart {get;set;}  //nav property 
} 

他にも1 xビューはモデルを単に商品のコレクションにするだけではなく、おそらくビューモールドに商品のコレクションが含まれていますが、訪問者と一緒に生成されたcartidも含むことになります。トランザクションが完了するまでCartIdはその訪問者を追跡し、OrderIdを持っているか、セッションが終了すると死んでしまいます。

@model simpleShop.Models.IndexViewModel 

<table class="table"> 
    <thead> 
     <tr> 
      <th>@Html.DisplayNameFor(model => model.Title)</th> 
      <th>@Html.DisplayNameFor(model => model.Info)</th> 
      <th>@Html.DisplayNameFor(model => model.Price)</th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model.Products) 
     { 
      <tr> 
       <td> 
        <a asp-action="Details" asp-route-id="@item.Id"> 
         @Html.DisplayFor(modelItem => item.Title) 
        </a> 
       </td> 
       <td>@Html.DisplayFor(modelItem => item.Info)</td> 
       <td>@Html.DisplayFor(modelItem => item.Price)</td> 
       <td> 
        <form asp-action="AddToCart"> 
         <input type="Hidden" asp-for="@Model.CartId" /> 

         <button type="submit" value="@item.Id">Add to cart</button> 
        </form> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 


public class IndexViewModel 
{ 
    public IndexViewModel(){} 

    public int CartId{get;set;} 
    public List<Product> Products{get;set;} 
} 

あなたはそこからアイデアを得ると思います。

関連する問題