C# 无法更新asp.net core 2.2中的会话内数据

C# 无法更新asp.net core 2.2中的会话内数据,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我想使用控制器更新会话数据(列表类型)。但它不起作用,它给了我一个错误 这是我的密码: [HttpGet] public IActionResult Cart() { List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");

我想使用控制器更新会话数据(列表类型)。但它不起作用,它给了我一个错误

这是我的密码:


        [HttpGet]
        public IActionResult Cart()
        {

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


        [HttpPost]
        public IActionResult Cart(int id)
        {
            List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");
           
            for (int i = 0; i < 10; i++)
            {
                if (spray[i].Id.Equals(id))
                {
                    spray[i].Quantity++;
                }
            }
           return RedirectToAction(nameof(Cart));

        }

[HttpGet]
公共IActionResult购物车()
{
List spray=HttpContext.Session.Get(“spray”);
如果(喷洒==null)
{
spray=新列表();
}
返回视图(喷洒);
}
[HttpPost]
公共IActionResult购物车(内部id)
{
List spray=HttpContext.Session.Get(“spray”);
对于(int i=0;i<10;i++)
{
if(喷洒[i].Id.Equals(Id))
{
喷雾[i].数量++;
}
}
返回重定向到操作(名称(购物车));
}
看法

@使用HuddsonBay.Models
@模型列表
@{
ViewData[“标题”]=“购物车”;
}
你的车

形象 名称 价格 产品类型 颜色 @foreach(模型中的var项目) { @项目名称 @项目.价格 @项目.数量 @item.ProductColor

当我点击“+”按钮时,我发现一个错误:

将使用控制器递增或递减。我将如何解决这个问题。
我是初学者,请帮助任何人。

您在for循环中硬编码了10项。如果您的列表中的项目少于10项,它将溢出。 对此进行更改(或使用foreach)

[HttpPost]
公共IActionResult购物车(内部id)
{
List spray=HttpContext.Session.Get(“spray”);
对于(int i=0;i
另一个选择是跳过循环,改为这样做

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));
}
public IActionResult购物车(int-id)
{
List spray=HttpContext.Session.Get(“spray”);
var item=spray.SingleOrDefault(x=>x.Id.Equals(Id));
如果(项!=null)
{
项目.数量++;
}
返回重定向到操作(名称(购物车));
}

您的问题可能不是您的会话。是关于
列表中的项目数。例外是关于
列表的长度。您的
for
始终最多为10个,并且您的列表中的项目可能较少,这就是为什么会出现超出范围的异常。

e> post方法中的List spray
是会话中列表的新实例,更改属性值后,需要在会话中再次存储新列表。否则,它仍然是原始列表

基于代码的测试示例:

视图:

@型号列表
@{
ViewData[“标题”]=“购物车”;
}
你的车

名称 价格 量 颜色 @foreach(模型中的var项目) { @项目名称 @项目.价格 @项目.数量 @item.ProductColor

仍然不工作。当我单击“+”按钮时,值没有增加/减少。
@model int

<form method="post">
    <td style="width:150px">
        <div class="btn-group">

            @*<a asp-action="Index"  class="btn btn-danger" asp-route-id="@Model">Add</a>*@
            <input type="submit" asp-action="Cart" asp-route-id="@Model" value="+" />
        </div>
    </td>
</form>
[HttpPost]
public IActionResult Cart(int id)
{
    List<Spray> spray = HttpContext.Session.Get<List<Spray>>("spray");
       
    for (int i = 0; i < spray.Count; i++)
    {
        if (spray[i].Id.Equals(id))
        {
            spray[i].Quantity++;
        }
    }
   return RedirectToAction(nameof(Cart));

}
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));
}
@model List<Spray>
@{
    ViewData["Title"] = "Cart";
}

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



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

        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                
                    <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>
[HttpGet]
public IActionResult Cart()
{

    var value = HttpContext.Session.GetString("spray");
    var spray = JsonConvert.DeserializeObject<List<Spray>>(value);

    if (spray == null)
    {
        spray = new List<Spray>();
    }
    return View(spray);
}


[HttpPost]
public IActionResult Cart(int id)
{
    var value = HttpContext.Session.GetString("spray");
    var spray = JsonConvert.DeserializeObject<List<Spray>>(value);

    for (int i = 0; i < spray.Count; i++)
    {
        if (spray[i].Id.Equals(id))
        {
            spray[i].Quantity++;
        }
    }
    HttpContext.Session.SetString("spray", JsonConvert.SerializeObject(spray));

    return RedirectToAction(nameof(Cart));

}