首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在OnGet()和OnPost()调用之间保持数据

如何在OnGet()和OnPost()调用之间保持数据
EN

Stack Overflow用户
提问于 2019-03-30 21:42:12
回答 2查看 1.6K关注 0票数 1

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

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

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

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

这是cshtml.cs

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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>
EN

Stack Overflow用户

发布于 2019-03-31 02:34:21

PageModel的TempData属性应该可以做到这一点。

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

代码语言:javascript
运行
复制
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
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55432021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档