代码之家  ›  专栏  ›  技术社区  ›  ubienewbie

我缺少什么会导致[TempData]修饰属性从get到post不保留值?

  •  0
  • ubienewbie  · 技术社区  · 6 年前

    我对asp.net core中TempData属性的理解是,它将model属性标记为需要在同一页的post和get之间保持值(可能比这更宽的生存期,但至少如此)。

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

    或者我是否误解了TempData作为属性应该做什么?如果我有,什么是最好的方式来实现我想做的?把电话号码传给视图,然后把它寄回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;
            });
    

    2 回复  |  直到 6 年前
        1
  •  7
  •   ubienewbie    6 年前

    好吧,我终于明白我的问题所在了。我有CookiePolicyOptions选项,checkconceptneedlambda仍然存在,即使我已经取出了cookieconcentpartial视图。因此,我假设为TempData提供支持的cookie没有被设置,因为实际上,我没有同意它们。

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

    在ASP.NET Core 2.0或更高版本中,默认情况下使用基于cookie的TempData提供程序将TempData存储在cookie中。

            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;
            });
    
        2
  •  0
  •   Senad MeÅ¡kin    6 年前

    如果要绑定属性,则应将属性设置为它[BindProperty],这应适用于后期操作:

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