Как сохранить данные между вызовами OnGet () и OnPost () - PullRequest
0 голосов
/ 30 марта 2019

Первое приложение Razor-страниц, которое я разрабатываю, так что я немного запутался.

Когда вызывается функция OnGet (), вызывается SpotifyAPI, чтобы получить списки воспроизведения для текущего пользователя иназначить их переменной.Затем эту переменную необходимо проверить по выбранным значениям в пользовательском интерфейсе при вызове OnPost ().

Проблема в том, что при вызове OnPost () переменная PlaylistsToLook теперь равна нулю.

IsЕсть ли способ сохранить значение между двумя вызовами?

Это 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>

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Для этого должно работать свойство TempData PageModel.

Версия на основе файлов 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

0 голосов
/ 30 марта 2019

Итак, я создал страницы Razor по умолчанию, и ниже приведены изменения, которые я сделал, чтобы сохранить данные в сеансе

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");
        }
    }

Это очень упрощенный пример, но вы можете прочитать об этом по адресу: Состояние сеанса в страницах Razor

...