ASP.NET Core MVC中不同的HttpGet方法之间的控制器属性不一致

时间:2019-01-13 02:26:30

标签: c# asp.net-core asp.net-core-mvc

我有一个Controller,该Controller具有页面使用的两种操作方法:

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

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

此外,如果我不会在Controller的构造函数中而是在OnGet方法中初始化该属性,那么即使先调用OnGet,SortData中的属性也将为null。

我的问题是如何获取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);
    }
}

当然,OnGet中使用的服务也已在Controller中初始化,但为了示例起见,我将其从示例中删除了。

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

1 个答案:

答案 0 :(得分:6)

是的,这是正确的行为。每个网络请求都位于自己的上下文中。您有两个Web请求,它将为每个请求实例化一个新的控制器,因此您当然没有相同的属性实例。

现在,您知道这是正确的行为,您将要提出一个新问题,即如何在多个请求中共享属性。但是,那是一个错误的问题。答案是“你不做”。 Web请求应该是无状态的。相反,您应该将排序参数添加到查询参数中。