所以我有这个问题,我无法解决我认为应该解决的问题。
我有一个ASP.NET Core 2.1 Razor页面项目。该代码粘贴在下面,我的问题如下:
在索引页面上,我有一个搜索表。我在搜索表单中输入的城市名称会在SearchResults OnPost方法中使用。
OnPost重定向到OnGet,后者基于从搜索表单传入的城市从数据库中检索一些结果。根据我的理解,TempData应该能够保留从表单传入的城市的值,但是,每当我尝试在OnGet方法中读取TempData [“ CityFromForm”]时,即使TempData字典中的内容为空, OnPost方法中我使用了TempData.Keep方法。
我目前的解决方案是在内存缓存中使用存储城市值,并将其传递给从数据库中获取数据的方法,但是我想知道为什么TempData方法不起作用。
在该项目的索引页上,有一个搜索,我从中输入要搜索其数据的城市,如下所示:
@model SearchDataViewModel
<form asp-page="/Search/SearchResults" method="post" class="col s6">
<div class="row">
<div class="input-field col s12">
<input placeholder="Please enter a city" type="text" name="City" class="validate autocomplete" id="autocomplete-input" autocomplete="off" />
<label for="City">City</label>
</div>
</div>
<div class="row">
<div class="input-field col s6">
<input id="StartDate" name="StartDate" type="text" class="datepicker datepicker-calendar-container">
<label for="StartDate">Start date</label>
</div>
<div class="input-field col s6">
<input id="EndDate" name="EndDate" class="datepicker datepicker-calendar-container" />
<label for="EndDate">End date</label>
</div>
</div>
<input type="submit" hidden />
</form>
以这种形式重要的是城市。该表格将发送到SearchResults剃刀页面。
SearchResults.cshtml.cs
public IActionResult OnPost()
{
// Cache search form values to persist between post-redirect-get.
var cacheEntry = Request.Form["City"];
_cache.Set<string>("City", cacheEntry);
TempData["CityFromFrom"] = Request.Form["City"].ToString();
TempData.Keep("CityFromForm");
return RedirectToPage();
}
// TODO: Find a better way to persist data between onPost and OnGet
public async Task OnGet(string city)
{
City = _cache.Get<string>("City");
var temp = TempData["CityFromForm"];
// Here I'd like to pass the TempData["CityFromForm"] but it's null.
await GetSearchResults(City); // this method just gets data from the database
}
答案 0 :(得分:0)
TempData键的前缀为“ TempDataProperty-”。因此,如果您有一个名为“城市”的钥匙,则可以通过TempData["TempDataProperty-City"]
来访问它。
请参见https://www.learnrazorpages.com/razor-pages/tempdata
您在分配临时数据值的行中也有错字:我怀疑TempData["CityFromFrom"]
应该是TempData [“ CityFromF or m”]。
答案 1 :(得分:0)
这就是我想出的,基本上我从搜索表单中得到一个城市字符串。在OnPost方法中,我重定向到页面,在其中添加OnGet方法可以使用的路由值。
在SearchResults.cshtml中,我添加了一个@page“ {city?}”
该网址最终看起来像:https://localhost:44302/Search/SearchResults?searchCity= {city}
在SearchResults.cshtml.cs
中 public async Task OnGet()
{
City = HttpContext.Request.Query["searchCity"];
PetGuardians = await GetSearchResults(City);
}
public IActionResult OnPost(string city)
{
return RedirectToPage(new { searchCity = city });
}