我有一个 Controller ,它有一个页面使用的两个操作方法:
在浏览器中访问页面时调用的标准 OnGet 和使用 anchor 标记调用的另一种方法 SortData。
这两个方法都与 Controller 的相同属性交互,但似乎每个方法都对属性有两个不同的对象引用,因为 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 的 anchor ,它也修改属性。但它与 OnGet 中的属性不同,它仍处于初始化状态。但我希望修改实际属性,然后返回包含排序数据的索引页。
最佳答案
是的,这是正确的行为。每个 Web 请求都存在于它自己的上下文中。你有两个网络请求,它为每个请求实例化一个新的 Controller ,所以你当然没有相同的属性实例。
既然您知道这是正确的行为,您将想问一个新问题,即如何在多个请求之间共享一个属性。然而,这是一个错误的问题。答案是“你不知道”。 Web 请求应该是无状态的。相反,您应该将排序参数添加到查询参数中。
关于c# - Controller 属性在 ASP.NET Core MVC 中的不同 HttpGet 方法之间不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165625/