我缺少什么导致 [TempData] decorated 属性 不保留从 get 到 post 的价值?

What am I missing that causes [TempData] decorated property not to retain value from get to post?

我对 asp.net 核心中的 TempData 属性的理解是,它将模型 属性 标记为需要在同一页面的 post 和获取之间保持值(并且可能寿命比那个长,但至少是那个)。

我的问题是,我标记为 TempData 并在 OnGetAsync 中成功设置的任何 属性 已在用户 post 返回表单时重置为空。为什么会这样?

还是我误解了 TempData 作为属性应该做什么?如果有,实现我想要做的事情的最好方法是什么?将 phone 数字传递给视图,然后 post 将其传回 OnPostAsync?!?

public class MyPageModel : PageModel
{
    [TempData] public string PhoneNumber { get; set; }

    public async Task<IActionResult> OnGetAsync(string phoneNumber)
    {
       PhoneNumber = phoneNumber; //THIS IS WORKING
       return Page();
    }

    public async Task<IActionResult> OnPostAsync()
    {
         user.PhoneNumber = PhoneNumber; //BUT BY HERE PHONENUMBER is NULL?
    }
}

//在 Startup.ConfigureServices // 我添加了之前没有的 CookieTempDataProvider,但我相信 CookieTempDataProvider 是默认启用的:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-2.1#tempdata

services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();
services.AddSession(options =>
        {
            //// Set a short timeout for easy testing.
            //options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
        });

想法?!

如果你想绑定一个 属性 你应该给它设置属性 [BindProperty] 这应该适用于 post 动作:

例如

 [BindProperty]
 public string PhoneNumber { get; set; }

好的,我终于明白我的问题是什么了。我的 CookiePolicyOptions options.CheckConsentNeeded lambda 仍然存在,即使我已经删除了 CookieConsentPartial 视图。因此,我假设为 TempData 提供支持的 cookie 没有设置,因为实际上,我没有同意它们。

供参考,在整理完以下内容后,我的 Configure 或 ConfigureServices 中不需要任何 TempData 或 Cookie 相关。因为根据 Session and app state in ASP.NET Core 文章:

In ASP.NET Core 2.0 or later, the cookie-based TempData provider is used by default to store TempData in cookies.

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
           // options.CheckConsentNeeded = context => true; // WORKED FINE WHEN I COMMENTED IT OUT.  DID NOT WORK WHEN COMMENTED IN.
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });