我有一个 ASP.net Core 项目。我想将整个模型(即产品列表)从视图通过“a”标签发送到控制器中的另一个获取操作。我使用了 TempData 但它不起作用。产品模型有很多属性和外键。 这是一个例子:
第一个行动是:
public IActionResult ShowProducts(int side, MyViewModel myViewModel)
{
ViewBag.side = side;
if (side == 0)
{
List<Product> products = ShowAllProducts();
return View(products);
}
List<Product> products2 = FilterProducts(myViewModel);
return View(products2 );
}
List<Product> FilterProducts(MyViewModel myViewModel)
{
List<Product> Products = new List<Product>() {};
//some code...
return products;
}
List<Product> ShowAllProducts()
{
return _context.Products.Include(p => p.Table1).Include(p => p.Table2)
.Include(p => p.Table3).Include(p => p.Table4)
.Include(p => p.Table5).Include(p => p.Table6)
.Include(p => p.Table7).Include(p => p.Table8).Tolist();
}
第二个行动是:
public IActionResult PrintProducts(List<Product> model)
{
return View(model);
}
显示产品视图是:
@model IEnumerable<Product>
@*some tag*@
<a title="Print" asp-action="PrintProducts" asp-route-model ="@Model"></a>
@*some tag*@
在此示例中,第二个操作中的模型为空。实际上并没有发送。
我改变了这样的观点:
@model IEnumerable<Product>
@*some tag*@
<a title="Print" href="@Url.Action("PrintProducts", "Controller", new { model = @Model })"></a>
@*some tag*@
但是这个方法也行不通。
我使用了
TempData
并更改了如下操作:
第一个动作:
public IActionResult ShowProducts(int side, MyViewModel myViewModel)
{
ViewBag.side = side;
if (side == 0)
{
List<Product> products = ShowAllProducts();
TempData["MyModel"] = products;
return View(products);
}
List<Product> products2 = FilterProducts(myViewModel);
TempData["MyModel"] = products2;
return View(products2 );
}
第二个行动是:
public IActionResult PrintProducts()
{
List<Product> model= TempData["MyModel"] as List<Product>;
return View(model);
}
但是这样一来,第一个视图根本没有加载!我收到状态代码 500。
有什么办法可以解决这个问题吗?
所以,如果你想显示大量数据,通常你会使用分页。这本质上将您的数据划分为多个称为页面的记录块。现在,如果你想在单个页面上显示所有数据,你可以在水下多次调用 GET 来获取你想要的所有数据。这减少了单次调用中的数据量。它还使事情更具可扩展性。
这是我的做法,它还包含过滤和排序。
[HttpGet]
[Route("GetAll")]
virtual public async Task<ActionResult<DbItem[]>> GetAll(string? filter, string? order, int? pageNo, int? pageSize)
{
IQueryable<DbItem> query = _context.Set<DbItem>();
// Apply filters to the query (you need to implement your filter logic)
if (!string.IsNullOrEmpty(filter))
{
//Example of how to filter by title
query = query.Where(a=>a.Title.Contains(filter));
}
// Apply ordering to the query if orderBy is provided
if (!string.IsNullOrEmpty(order))
{
// Exmaple where order contains your property name
query.OrderBy(e => EF.Property<DbItem>(e, order));
}
// Ensure the pagesize is something reasonable
pageSize ??= 30;
if (pageSize < 1 || pageSize > 30)
pageSize = 30;
// Ensure the page is something reasonable
pageNo ??= 0;
if (pageNo < 0)
pageNo = 0;
// Apply paging to the query
int skip = pageNo.Value * pageSize.Value;
query = query.Skip(skip).Take(pageSize.Value);
// Execute the query and return the items
var result = await query.ToListAsync();
return Ok(result);
}