重定向到页面后,TempData词典为null

时间:2018-10-28 11:58:19

标签: asp.net asp.net-core razor-pages tempdata

所以我有这个问题,我无法解决我认为应该解决的问题。

我有一个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

    }

2 个答案:

答案 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 });
    }