C# 在OnGet()方法之后,ASP.Net对象被设置回null

C# 在OnGet()方法之后,ASP.Net对象被设置回null,c#,asp.net,asp.net-core,razor,razor-pages,C#,Asp.net,Asp.net Core,Razor,Razor Pages,我建立了一个购物网站,当我试图发布一些数据时遇到了这个错误。奇怪的是,这个对象显然是空的,尽管我可以把产品的名称、价格、,照片和数量在页面上。我有一个产品类和一个产品模型类,其中包含一个产品列表。在产品模型类构造函数中,我用我想在网站上显示的产品创建列表。无论如何,我有一个“服装”页面,其中有一个“产品”列表对象,它使用ProductModel类访问产品列表,其中包含有关我要显示的产品的所有数据。当我使用断点检查产品是否发送到“衣服”页面时,我发现产品列表为空 在“Clothing”页面模型中,

我建立了一个购物网站,当我试图发布一些数据时遇到了这个错误。奇怪的是,这个对象显然是空的,尽管我可以把产品的名称、价格、,照片和数量在页面上。我有一个产品类和一个产品模型类,其中包含一个产品列表。在产品模型类构造函数中,我用我想在网站上显示的产品创建列表。无论如何,我有一个“服装”页面,其中有一个“产品”列表对象,它使用ProductModel类访问产品列表,其中包含有关我要显示的产品的所有数据。当我使用断点检查产品是否发送到“衣服”页面时,我发现产品列表为空

在“Clothing”页面模型中,ProductModel对象首先被实例化为null,然后构造函数启动。列表是用我放入其中的对象创建的,“Clothing”页面上的产品列表具有以前创建的值,一切正常。页面加载“Clothing”上的产品列表后页面被设置回空

我将提供我编写的代码:

public class Product
    {
        public string ID { get; set; }
        public string Name { get; set; }

        public string Photo { get; set; }
        public double Price { get; set; }

        public int Quantity { get; set; }
        public Product()
        {
            
        }
    }
产品型号类别:

 public class ProductModel
        {
            public List<Product> Products { get; set; }
            public ProductModel()
            {
                Products = new List<Product>()
                {
                    new Product{
                        ID="1",
                        Name="Tommy Hilfiger T-Shirt",
                        Photo="/lib/tommyH.jpg",
                        Price=120,
                        Quantity=0
                    },
                    new Product{
                        ID="2",
                        Name="Tommy Hilfiger T-Shirt 2",
                        Photo="/lib/h6.jpg",
                        Price=120,
                        Quantity=0
                    },
                    new Product{
                        ID="3",
                        Name="Tommy Hilfiger T-Shirt 3",
                        Photo="/lib/h3.jpg",
                        Price=120,
                         Quantity=0
                    },
                    new Product{
                        ID="4",
                        Name="Tommy Hilfiger T-Shirt ",
                        Photo="/lib/tommyH.jpg",
                        Price=120,
                           Quantity=0
                    },
                };
            }
    
            public List<Product> findAll()
            {
                return this.Products;
            }
    
            public Product find(string id)
            {
                return this.Products.Where(p => p.ID == id).FirstOrDefault();
            }
    
        }
公共类产品模型
{
公共列表产品{get;set;}
公共产品模型()
{
产品=新列表()
{
新产品{
ID=“1”,
Name=“Tommy Hilfiger T恤”,
Photo=“/lib/tommyH.jpg”,
价格=120,
数量=0
},
新产品{
ID=“2”,
Name=“Tommy Hilfiger T恤2”,
Photo=“/lib/h6.jpg”,
价格=120,
数量=0
},
新产品{
ID=“3”,
Name=“Tommy Hilfiger T恤3”,
Photo=“/lib/h3.jpg”,
价格=120,
数量=0
},
新产品{
ID=“4”,
Name=“Tommy Hilfiger T恤”,
Photo=“/lib/tommyH.jpg”,
价格=120,
数量=0
},
};
}
公共列表findAll()
{
退回此产品;
}
公共产品查找(字符串id)
{
返回此.Products.Where(p=>p.ID==ID).FirstOrDefault();
}
}
这是“服装”页面背后的代码:

公共类服装模型:PageModel
{
公共列表产品{get;set;}
公共互联网
{
ProductModel ProductModel=新的ProductModel();
Products=productModel.findAll();
}
postadd上的公共无效(字符串ID)
{
Product toBuy=Products.Where(p=>p.ID==ID.FirstOrDefault();
toBuy.Quantity++;
List Stored=SessionHelper.GetObjectFromJson(HttpContext.Session,“产品”);
存储。添加(toBuy);
SetObjectAsJson(HttpContext.Session,“产品”,存储);
}
}
最后,这里是我在页面上显示产品的方式:

 <div class="card-deck">
        @foreach (var product in Model.Products)
        {
            <div class="card">
                <img src="@product.Photo" class="card-img-top">
                <div class="card-body">
                    <h5 class="card-title">@product.Name</h5>
                    <p class="card-text">@product.Price</p>
                    <input type="hidden" value="@product.ID" />
                    <form method="post" asp-page-handler="add">
                        <button class="btn btn-primary" type="submit" asp-route="@product.ID">Buy</button>
                    </form>
                </div>
            </div>
        }

    </div>

@foreach(模型产品中的var产品)
{
@产品名称

@product.Price

购买 }

问题出现在
@foreach(Model.Products中的var-product)
语句中。它表示
模型中的
产品
具有空值。

请求通常是无上下文的,因此除非您将产品存储在某处,否则每次发出新请求时,它们都将为
空。
所以你有两个问题:不点击你的post方法和不“重新加载”产品

第一个问题是,您没有点击post方法
OnPostAdd
(您应该使用断点进行验证),而是点击了默认的
OnPost
,因为您没有定义它,直接呈现视图,因为asp.net是无上下文的,所以产品是
null
,您会得到
NullReferenceException

如果您希望“禁用”默认OnPost,则应添加
public IActionResult OnPost()=>NotFound()
对于页面模型,这也将验证您是否使用了默认的页面模型


第二个问题,您的post方法中的产品是
null
,因此您必须再次加载它们,否则您将在
产品上出现相同的异常。其中(p=>p.ID==ID)
您只填写了产品属性,但从未将其发送到视图 您应该将“onGet()”方法更改为:

public void OnGet()
     {
         ProductModel productModel = new ProductModel();
         Products = productModel.findAll();
         return View(Products); 
     }
并在razor文件顶部的下面一行添加类似的内容:

 @model IEnumerable<Product>

祝你好运

我尝试了你的代码,出现了与你相同的问题。似乎路由不正确,未触发添加后处理程序。您应该从按钮中删除
asp route
属性

<div class="card-deck">
@foreach (var product in Model.Products)
{
    <div class="card">
        <div class="card-body">
            <h5 class="card-title">@product.Name</h5>
            <p class="card-text">@product.Price</p>
            <form method="post" asp-page-handler="Add">
                <input type="hidden" value="@product.ID" name="ID" />
                <button class="btn btn-primary" type="submit">Buy</button>
            </form>
        </div>
    </div>
}
</div>

@foreach(模型产品中的var产品)
{
@产品名称

@product.Price

购买 }
“服装”页面后面的代码:

公共类服装模型:PageModel
{
公共列表产品{get;set;}
公共互联网
{
ProductModel ProductModel=新的ProductModel();
产品
     @foreach (var product in Model)
      {
        //...
      }
<div class="card-deck">
@foreach (var product in Model.Products)
{
    <div class="card">
        <div class="card-body">
            <h5 class="card-title">@product.Name</h5>
            <p class="card-text">@product.Price</p>
            <form method="post" asp-page-handler="Add">
                <input type="hidden" value="@product.ID" name="ID" />
                <button class="btn btn-primary" type="submit">Buy</button>
            </form>
        </div>
    </div>
}
</div>
public class ClothingModel : PageModel
{
    public List<Product> Products { get; set; }
    public void OnGet()
    {
        ProductModel productModel = new ProductModel();
        Products = productModel.findAll();
    }

    public void OnPostAdd(string  ID)
    {
        ProductModel productModel = new ProductModel();
        Products = productModel.findAll();
        Product toBuy = Products.Where(p =>p.ID==ID).FirstOrDefault();
        //your code
    }
}