c# - Controller 属性在 ASP.NET Core MVC 中的不同 HttpGet 方法之间不一致

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

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

相关文章:

asp.net-core - NPoco 在 .net Core 中的使用

c# - 使用 InMemory 测试 ASP.NET Core API Controller

c# - MVC 核心 Controller 中的对象数组始终为 null

c# - 带有 Entity Framework 7 (rc1) 的全局表前缀

c# - c# 中的 autokey vigenere 解密

c# - 如何在 C# 中检查打印机状态?

c# - 如何在 F# Giraffe Web API 中检索 url 编码形式?

c# - Visual Studio 2013 Typescript 集成中断

asp.net-mvc - ASP.NET 5 中的 Web 应用程序

asp.net - 在 ASP.NET Core 中使用防伪 cookie,但使用非默认 CookieName