C# 在OnGet()方法之后,ASP.Net对象被设置回null
我建立了一个购物网站,当我试图发布一些数据时遇到了这个错误。奇怪的是,这个对象显然是空的,尽管我可以把产品的名称、价格、,照片和数量在页面上。我有一个产品类和一个产品模型类,其中包含一个产品列表。在产品模型类构造函数中,我用我想在网站上显示的产品创建列表。无论如何,我有一个“服装”页面,其中有一个“产品”列表对象,它使用ProductModel类访问产品列表,其中包含有关我要显示的产品的所有数据。当我使用断点检查产品是否发送到“衣服”页面时,我发现产品列表为空 在“Clothing”页面模型中,ProductModel对象首先被实例化为null,然后构造函数启动。列表是用我放入其中的对象创建的,“Clothing”页面上的产品列表具有以前创建的值,一切正常。页面加载“Clothing”上的产品列表后页面被设置回空 我将提供我编写的代码: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”页面模型中,
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
}
}