我正在开发的第一个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>发布于 2019-03-30 23:13:47
所以我创建了一个默认的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");
}
}这是一个非常简单的示例,但您可以在以下位置了解更多信息:Session State in Razor Pages
发布于 2019-03-31 02:34:21
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
https://stackoverflow.com/questions/55432021
复制相似问题