【问题标题】:could not update the value of session data in asp.net core无法在 asp.net core 中更新会话数据的值
【发布时间】:2020-08-09 14:08:55
【问题描述】:

我想更新数量数据,为此,我使用了一个控制器,我调试并查看,在 HTTPpost 中,数量值的值成功更新。但是当调试指针转到 HTTPget 方法时,它没有更新,我又一次找到旧的数量值。

对于这些输出,我的代码是:

   [HttpGet]
        public IActionResult Cart()
        {
            List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");

            if (spray == null)
            {
                spray = new List<Spray>();
                HttpContext.Session.Set("spray", spray);
            }
            return View(spray);
        }

        [HttpPost]
        public IActionResult Cart(int id)
        {
            List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");

            var item = spray.SingleOrDefault(x => x.Id.Equals(id));
            if (item != null)
            {
                item.Quantity++;
            }

            return RedirectToAction(nameof(Cart));
        }

在这里,我添加了旧数量的会话数据。这段代码是:


        [HttpGet]

        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            var product = _db.Spray.Include(c => c.ProductTypes).FirstOrDefault(c => c.Id == id);

            if (product == null)
            {
                return NotFound();
            }

            return View(product);
        }




        [HttpPost]
        [ActionName("Details")]

        public ActionResult ProductDetails(int id,Spray s)
        {

            var r = _db.Spray.Include(c => c.ProductTypes).FirstOrDefault(c => c.Id == id);
            r.Quantity = s.Quantity;

            //List<Spray> spray = new List<Spray>();
            if (Utility.SessionExtensions.Get<List<Spray>>(HttpContext.Session, "spray") == null)
            {
                List<Spray> spray = new List<Spray>();
              
                spray.Add(r);
                r.Quantity = s.Quantity;

                Utility.SessionExtensions.Set(HttpContext.Session, "spray", spray);
            }

            else
            {
              
                List<Spray> spray = Utility.SessionExtensions.Get<List<Spray>>(HttpContext.Session, "spray");
                int index = isExist(id);
                if (index != -1)
                {
                    spray[index].Quantity++;
                }
                else
                {
                    var m = _db.Spray.Include(c => c.ProductTypes).FirstOrDefault(c => c.Id == id);
                    m.Quantity = s.Quantity;
                    spray.Add(m);
                }
                Utility.SessionExtensions.Set(HttpContext.Session, "spray", spray);
            }
            return RedirectToAction("Index");

           
        }

        private int isExist(int id)
        {
            List<Spray> spray = Utility.SessionExtensions.Get<List<Spray>>(HttpContext.Session, "spray");
            var r = _db.Spray.Include(c => c.ProductTypes).FirstOrDefault(c => c.Id == id);
            for (int i = 0; i < spray.Count; i++)
            {
                if (spray[i].Id.Equals(id))
                {
                    return i;
                }
            }
            return -1;
        }

Details.cshtml

<form method="post" asp-action="" enctype="multipart/form-data">
    <div class="row">
        <div class="col-1">

            <img src="~/@Model.Image" style="width:100%" onclick="myFunction(this);">
            </br></br>
            <img src="~/@Model.Image1" style="width:100%" onclick="myFunction(this);">
        </div>

        <div class="col-4 container">
            <span onclick="this.parentElement.style.display='none'" class="closebtn">&times;</span>
            <img id="expandedImg" style="width:100%">
            <div id="imgtext"></div>
        </div>
        <div class="col-4">
            <input type="hidden" asp-for="Id" />
            <h2>@Model.Name</h2>

            <p><b>@Model.Description</b></p>

            <h4>@Model.Price $</h4>
            <small class="text-danger">Clearence</small>
            </br>
            <hr>
            <h4>Size:@Model.Size</h4>
            <h6>Product Color:@Model.ProductColor</h6>
            </br></br></br></br>





            <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
            <div class="col-sm-12 col-xs-12 spinner-block">
                <div class="number-spinner">

                    <div class="input-group number-spinner">
                        <b class="mr-4"> <label asp-for="@Model.Quantity"></label></b></br>
                        <span class="input-group-btn">
                            <button type="button" class="btn btn-default btn-number btncartsniper" data-type="minus" data-dir="dwn"><span class="fa fa-minus fa-sm"></span></button>
                        </span>
                        <input asp-for="@Model.Quantity" class="form-control input-number Snippper_qty" value="0" type="number">
                        <span class="input-group-btn">
                            <button type="button" class="btn btn-default btn-number btncartsniper" data-type="plus" data-dir="up"><span class="fa fa-plus fa-sm"></span></button>
                        </span>
                    </div>
                </div>




            </div>
           
            
                <input type="submit" value="Add To Cart" class="btn btn-dark form-control" />
            
            @if (Model.Quantity > 0)
            {
                <h3>This Product Is InStock</h3>
            }
            else
            {
                <h1>Not InStock</h1>
            }
        </div>






    </div>







    <div>

        <a asp-action="Index" class="btn btn-dark">Back To List</a>
    </div>

</form>


购物车.cshtml

@using HuddsonBay.Models
@model List<Spray>
@{
    ViewData["Title"] = "Cart";
}

<h1>Your Cart</h1>
<br />



<div class="row">
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>Image</th>
                <th>Name</th>
                <th>Price</th>
                <th>Quantity</th>
                <th>Color</th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (var item in Model)
            {
            <tr>
                <td>
                    <img src="~/@item.Image" width="200px" height="150px" />
                </td>
                <td>@item.Name</td>
                <td>@item.Price</td>
                <td>@item.Quantity</td>
                <td>
                    <partial name="_QuantityPartial" model="@item.Id" />
                </td>

                <td>@item.ProductColor</td>
                <td>
                    <a asp-area="Customer" asp-action="Remove" asp-controller="SprayShow" asp-route-id="@item.Id" class="btn btn-danger">
                        <i class="fas fa-trash"></i>
                    </a>
                </td>

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

<div class="row">
    <div class="col-6">
        <a asp-action="Index" asp-controller="SprayShow" class="btn btn-primary">Back To Home</a>
    </div>
    <div class="col-6 text-right">
        <h3>Total Amount</h3>
        <h3>Grand Total : @Model.Sum(c => c.Price)</h3>
        <a asp-area="Customer" asp-action="Checkout" asp-controller="Order" class="btn btn-info">Process To CheckOut</a>

    </div>
</div>









我的输出是:

当我点击“+”按钮时,它会响应到购物车“httpPost”,这里数量值增加,但是当调试指针转到购物车“HTTPget”时,我找到了数量的旧值。同样,我找不到我的输出的更新数量值。我想增加我的数量价值。

我是初学者。请帮助任何人。

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc


    【解决方案1】:

    ASP.NET Core 中的会话数据是序列化的,而不是实际的对象。这意味着当您获取对象并对其进行修改时,不会存储任何内容,因为会话存储中没有与序列化数据的链接。在修改了其中的任何内容后,您必须将修改后的列表存储回会话中。

    documentation

    【讨论】:

      【解决方案2】:
          [HttpPost]
          public IActionResult Cart(int id)
          {
              List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");
      
              var item = spray.SingleOrDefault(x => x.Id.Equals(id));
              if (item != null)
              {
                  item.Quantity++;
                 
                  HttpContext.Session.Set("spray", spray); //it's must add for a set new session data
              }
      
              return RedirectToAction(nameof(Cart));
          }
      

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 1970-01-01
        • 2020-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        • 2018-09-21
        相关资源
        最近更新 更多