【问题标题】:ASP.NET - modifying controller class variable using controller methodASP.NET - 使用控制器方法修改控制器类变量
【发布时间】:2021-01-12 02:10:15
【问题描述】:

我开始学习 C#,但遇到了一个小问题。 我有一个控制器变量如下:

public class HomeController : Controller
{
    // Empty List
    List<Something> FilteredSomethingLists = new List<Something>(); 

然后我在控制器中有一个IActionResult 方法,如下所示:

public IActionResult Filter(string Attribute1, string Attribute2, int page)
{
    // TestModel will create a list with random data, then filter the list with 
    // (Attribute1 and 2, then add to the FilteredSomethingLists
    foreach (Something p in TestModel.FilterSomething(Attribute1, Attribute2)) 
    {
        FilteredSomethingLists.Add(p);
    }

    ...

    // Display some result on the first page
    return View(...);
}

在上面的Filter方法中,TestModel会首先创建一个随机Something值的列表,然后FilterSomething方法会从列表中过滤出一些SomethingObj给定的属性,然后这些对象被添加进入FilteredSomethingLists。我已经调用了Filter.cshtml中的Filter方法,FilteredSomethingLists中的对象完美的显示在了网页上。

但是,当我有其他方法时:

public IActionResult Paging(int page)
{
    Console.WriteLine(FilteredSomethingLists[0].SomeAttribute);
    
    ...
    
    return View(...);
}

网页上什么都没有显示,控制台输出也没有,这意味着FilteredSomethingLists仍然是空的,即使调用了Filter方法。

我这样做是因为我想在FilteredSomethingLists 上进行分页,但是再次调用具有不同页码值的Filter 方法将由TestModel 生成一个全新的SomethingLists,所以我想我可以通过调用Filter 来显示FilteredSomethingLists 的第一页,然后为下一页调用Paging,这样我就可以避免重新初始化FilteredSomethingLists。但是没有用。

【问题讨论】:

    标签: c# model-view-controller .net-core asp.net-core-mvc


    【解决方案1】:

    Web 是无状态的,因此信息不会在请求之间持续存在。如果需要过滤列表,则需要重建服务器端并返回过滤后的列表。另一种选择是通过 POST 请求将列表传回服务器,然后进行过滤,但这会增加返回服务器的流量。

    [HttpPost]
    public IActionResult Paging(PagingRequest request)
    {
        var FilteredSomethingLists = constructFilteredList(request);
        Console.WriteLine(FilteredSomethingLists[0].SomeAttribute);
        
        ...
        
        return View(...);
    }
    

    这只是可以做的一个例子。您的过滤列表函数将是一个 Linq 查询,它接受您的输入参数,然后从数据库中过滤结果集。您可以使用 fluent API 或内联 Linq。

    为了处理不同的页面,Linq 在IQueryable 上有一个SkipTake 函数。您跳过的数字将是页码乘以每页的项目。然后你会Take每页的项目数。

    【讨论】:

    • 不确定我是否走在正确的轨道上,但我在 Models 下创建了一个新的 Repository 类,并尝试在那里进行 contructFilteredList 工作。 (不知道如何修改旧模型,因为我不熟悉界面和东西)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多