如何将模型(包含超过 3000 条记录的列表)从视图发送到 ASP.Net Core 中的另一个 get 操作?

问题描述 投票:0回答:1

我有一个 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。

有什么办法可以解决这个问题吗?

c# html asp.net-core parameter-passing model-binding
1个回答
0
投票

所以,如果你想显示大量数据,通常你会使用分页。这本质上将您的数据划分为多个称为页面的记录块。现在,如果你想在单个页面上显示所有数据,你可以在水下多次调用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.