【问题标题】:TempData Dictionary is null after Redirect to page重定向到页面后,TempData 字典为空
【发布时间】:2019-04-01 13:04:04
【问题描述】:

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

我有一个 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 razor 页面。

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

    }

【问题讨论】:

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


    【解决方案1】:

    TempData 键以“TempDataProperty-”为前缀。因此,如果您有一个名为“City”的密钥,您可以通过TempData["TempDataProperty-City"] 访问它。

    https://www.learnrazorpages.com/razor-pages/tempdata

    您在分配 tempdata 值的行中也有错字:TempData["CityFromFrom"] 应该是 TempData["CityFromForm"],我怀疑。

    【讨论】:

    • 感谢您加入讨论。可悲的是,我去了那个指南并使用了 TempData["TempDataProperty-xxx"] 但没有成功。 TempDataDictionary 计数在 OnPost 方法中为 1,一旦进入 OnGet 方法,即使使用了 TempData.Keep(),临时数据计数为 0。
    【解决方案2】:

    所以这就是我想出的,基本上我从搜索表单中得到一个城市字符串。在 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 });
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-06
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多