Controller Core MVC中的不同HttpGet方法之间的Controller属性不一致

pur*_*ule 1 c# asp.net-core-mvc asp.net-core

我有一个控制器,它有一个页面使用的两种操作方法:

在浏览器中访问页面时调用的标准OnGet,以及使用锚标记调用的另一个方法SortData.

这两个方法都与控制器的相同属性交互,但似乎对每个方法的属性都有两个不同的对象引用,因为SortData中的数据与OnGet中的日期不一致.

另外,如果我不在Controller的构造函数中但在OnGet方法内部初始化该属性,它将在SortData内部为null,即使首先调用了OnGet.

我的问题是如何让SortData使用OnGet使用的相同属性?

代码如下所示:

public class MyController : Controller
{
    private MyClass Property {get; set;}

    public SearchController()
    {
        Property = new MyClass()
    }

    [HttpGet("sortdata")]
    public IActionResult SortData(string sortAttribute)
    {
        Property.SortData(sortAttribute);
        return View("Index", Property);
    }

    public IActionResult OnGet([FromQuery]string requeststring)
    {
        ViewData["Message"] = requeststring;
        Property.Datas = requeststring == null ?
            searchService.GetAll() :
            searchService.searchByRequestString(requeststring);
        return View("Index", Property);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,OnGet中使用的服务也在Controller中初始化,但我从示例中删除它以使其保持相当简单.

因此,您可以看到OnGet修改了Property并返回了Index页面.在那个页面上,有一个调用SortData的锚,它也修改了Property.但它与OnGet中的属性不同,它仍处于初始状态.但是我希望修改实际的Property,然后返回带有排序数据的Index页面.

Eri*_*sch 6

是的,这是正确的行为.每个Web请求都存在于它自己的上下文中.你有两个Web请求,它为每个请求实例化一个新的控制器,所以当然你没有相同的属性实例.

既然您知道这是正确的行为,您将需要提出一个新问题,即如何跨多个请求共享属性.然而,那是错误的问题.答案就是"你没有".网络请求应该是无国籍的.相反,您应该将排序参数添加到查询参数中.