【问题标题】:How to persist data between OnGet() and OnPost() calls如何在 OnGet() 和 OnPost() 调用之间保持数据
【发布时间】:2019-08-21 06:08:35
【问题描述】:

我正在开发的第一个 Razor-pages 应用程序,所以我有点困惑。

当调用 OnGet() 函数时,会调用 SpotifyAPI 来获取当前用户的播放列表并将它们分配给一个变量。然后需要根据 OnPost() 调用时 UI 上的选定值检查此变量。

问题是,当调用 OnPost() 时,PlaylistsToLook 变量现在为空。

有没有办法保留两次调用之间的值?

这是cshtml.cs

public class CreateModel : PageModel
    {
        private readonly Models.AppDbContext _context;

        public CreateModel(Models.AppDbContext context)
        {
            _context = context;
        }

        public void OnGet()
        {
            PlaylistsToLook = PlaylistRequestService.GetUserPlaylists(_context);
        }

        public void OnPost(string[] playlistsToLook)
        {
            foreach (var playlistId in playlistsToLook)
            {
                PlaylistRequest.PlaylistsToLook.Add(PlaylistsToLook.First(x => x.id.Equals(playlistId)));
            }
            _context.PlaylistRequests.Add(PlaylistRequest);

            PlaylistRequestService.ProcessPlaylistRequest(PlaylistRequest, _context);
        }

        [BindProperty]
        public List<SpotifyPlaylist> PlaylistsToLook { get ; set; }

        [BindProperty]
        public Models.PlaylistRequest PlaylistRequest { get; set; }
    }

这是cshtml

@page
@model SpotifyPlaylistCurator.Pages.PlaylistRequest.CreateModel
@{
    ViewData["Title"] = "CreatePlaylist";
}

<h2>Create a Playlist</h2>
<form method="POST">
    <div class="form-group">
        <label asp-for="PlaylistRequest.Name" class="control-label"></label>
        <input asp-for="PlaylistRequest.Name" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="PlaylistRequest.Duration" class="control-label"></label>
        <input asp-for="PlaylistRequest.Duration" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="PlaylistRequest.PlaylistsToLook" class="control-label"></label>
        @{
        int cnt = 0;
            foreach (var playlist in Model.PlaylistsToLook)
            {
                if (cnt++ % 3 == 0)
                {
                    @:</tr><tr>
                }
                @:<td>
                    <input type="checkbox"
                           name="playlistsToLook"
                           value="@playlist.id" />
                            @playlist.name
                @:</td>
            }
        }
      </div>
    <div></div>
    <input type="submit" name="Create a Playlist" />
</form>

【问题讨论】:

    标签: c# .net razor-pages


    【解决方案1】:

    所以我创建了一个默认的 Razor 页面,下面是我为在 Session 中保留数据所做的更改

    public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
    
            // ADD SESSION
            services.AddSession(options => {
                options.IdleTimeout = TimeSpan.FromMinutes(30);
            });
            // ADD MEMOERY CACHE
            services.AddMemoryCache();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
    
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }
    
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            //app.UseCookiePolicy(); I HAD TO COMMENT THIS LINE TO MAKE IT WORK
    
            // ADD USESESSION
            app.UseSession();
            app.UseMvc();
        }
    

    在控制器中:

        public void OnGet()
        {
            var s = HttpContext.Session.GetString("MyData");
            if (!String.IsNullOrWhiteSpace(s))
            {
    
            }
            else
            {
                this.HttpContext.Session.SetString("MyData", "Test Data Here");
            }            
        }
    
        public void OnPost()
        {
            var s = HttpContext.Session.GetString("MyData");
            if (!String.IsNullOrWhiteSpace(s))
            {
    
            }
            else
            {
                this.HttpContext.Session.SetString("MyData", "Test Data Here");
            }
        }
    

    这是一个非常简单的示例,但您可以在以下网址了解更多信息: Session State in Razor Pages

    【讨论】:

      【解决方案2】:

      PageModel 的 TempData 属性应该适用于此。

      默认启用基于 cookie 的版本,但如果列表大于 500 字节,您将需要使用基于会话的版本:

      public void ConfigureServices(IServiceCollection services)
      {
          // snip
      
          services.AddMvc()
              .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
              .AddSessionStateTempDataProvider();
      
          services.AddSession();
      }
      
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
          // snip
      
          app.UseHttpsRedirection();
          app.UseStaticFiles();
          app.UseCookiePolicy();
          app.UseSession();
          app.UseMvc();
      }
      

      来源: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-2.2#tempdata

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        相关资源
        最近更新 更多