Сохранять значения при отправке формы Razor Pages

Я использую Razor Pages 7. На моей странице есть фильтрация, сортировка и пейджинг.

MyPage.cshtml.cs

public SelectList Products { get; set; }
public int Sort { get; set; }
public int Page { get; set; }
public int Filter { get; set; }

public async Task OnGetAsync(int sort, int page, int filter) {
  //...
}

MyPage.cshtml

<form method = "get" asp-page = "" asp-route-sort=@Model.Sort asp-route-page=@Model.Page>
  <select name = "filter" asp-items=@Model.Products>
    <option selected value = "0">Filter by product</option>
  </select>
  <input type = "submit" value = "submit" />
</form>

Это правильно отображается как:

<form method = "get" action = "/mypage?sort=10&page=3">
  ...
</form>

Но когда я отправляю форму, действие get связывает только аргумент filter. Аргументы sort и page не связаны с action формы.

Предлагает ли RazorPages способ связать их?

(Я мог бы сделать это с помощью JavaScript, но я надеюсь, что есть собственный подход RazorPages.)


ОБНОВЛЕНИЕ Я нашел способ, используя скрытые входы. В виде:

<input type = "hidden" name = "sort" value=@Model.Sort />
<input type = "hidden" name = "page" value=0 />  <!-- reset page on filter change -->

Но это ручной подход со многими волшебными строками. Есть ли «родной» способ RazorPages?

Предыстория информация.

lonix 17.02.2023 12:14
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Это правильно отображается как:
<form method = "get" action = "/mypage?sort=10&page=3">   ... </form>

Он уже правильно соответствует asp-route-somekey=someval HTML, добавляя пары ключ-значение к части запроса.

Но когда я отправляю форму, действие get связывает только фильтр аргумент. Аргументы sort и page не привязаны к форме. действие

Фактически, это проблема, связанная с Html5, когда вы отправляете форму с помощью метода GET, параметры запроса атрибута действия будут удалены. Если вы проверите URL-адрес, это будет "/mypage?filter=someval"

Единственное решение для добавления параметров запроса, на которые вы сами ответили

Если вы согласны, добавьте аргументы в часть маршрута зарегистрируйте маршрут вашей страницы, например:

@page "/MyPage/{key1?}/{key2?}"

Результат:

Я только что попытался с помощью жесткого кодирования воспроизвести ошибку:

@{
    var dic = new Dictionary<string, string>()
    {
        {"key1","10"},
        {"key2","2"}
    };
}


<form method = "get" asp-page = "/MyPage" asp-all-route-data=@dic >
  <select name = "filter" >
    <option selected value = "0">Filter by product</option>
     <option  value = "1">item1</option>
      <option value = "2">item2</option>
  </select>
  <input type = "submit" value = "submit"  />
</form>

Спасибо за подтверждение. Есть ли какой-то «способ Razor Pages», чтобы сделать мой код более дружелюбным и иметь меньше волшебных строк? Может быть, какие-то помощники по тегам или что-то в этом роде? Я уже обнаружил, что есть полезный атрибут [HiddenInput].

lonix 17.02.2023 08:28

Я обновил решение, которое передает аргументы с частью маршрута, это может помочь, если вы примете передачу значения с маршрутом

Ruikai Feng 17.02.2023 08:32

Недавно я столкнулся со случаем, связанным с routedata, поэтому я придумал решение routedata, надеюсь, оно поможет stackoverflow.com/questions/75410483/…

Ruikai Feng 17.02.2023 08:37

Еще одна вещь, если вы не возражаете? Как выглядит ваш cshtml? Я написал свою форму без [BindProperty], но я вижу из вашего видео, что вы сделали это по-другому - и я предполагаю, что ваш способ лучше, чем мой, поэтому мне любопытно... :-)

lonix 17.02.2023 08:54

Я только что попытался воспроизвести ошибку с помощью жесткого кодирования, [BindProperty(SupportGet = "true")] attr позволяет вам привязать свойство модели страницы, когда вы нажимаете метод onget, поэтому мне не нужно снова писать аргументы, я просто привык к этому

Ruikai Feng 17.02.2023 09:05

Другие вопросы по теме