Словарь TempData является нулевым после Перенаправления на страницу - PullRequest
0 голосов
/ 28 октября 2018

Итак, у меня есть проблема, которую я не могу решить так, как я думаю, она должна быть решена.

У меня есть проект страниц ASP.NET Core 2.1 Razor.Код вставлен ниже, и моя проблема заключается в следующем:

На странице индекса, у меня есть форма поиска.Название города, которое я ввожу в форму поиска, используется в методе SearchResults OnPost.

OnPost перенаправляет на OnGet, который извлекает некоторые результаты из базы данных на основе города, переданного из формы поиска.Насколько я понимаю, TempData должна иметь возможность сохранять значение для города, переданного из формы, однако всякий раз, когда я пытаюсь прочитать TempData ["CityFromForm"] в методе OnGet, словарь 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 голосов
/ 29 октября 2018

Итак, вот что я придумала, в основном я получаю строку города из формы поиска.В методе OnPost я перенаправляю на страницу, где добавляю значение маршрута, которое может использовать метод OnGet.

В SearchResults.cshtml я добавил @page "{city?}"

URL заканчиваетсявыглядит как: https://localhost:44302/Search/SearchResults?searchCity={city}

In 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 });
    }
0 голосов
/ 28 октября 2018

Ключи TempData имеют префикс «TempDataProperty-».Таким образом, если у вас есть ключ с именем «City», вы получаете к нему доступ через TempData["TempDataProperty-City"].

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

У вас также есть опечатка в строке, где вы присваиваете значение временных данных:TempData["CityFromFrom"] должно быть TempData ["CityFromF или m"], я подозреваю.

...