Я использую 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?
Это правильно отображается как:
<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].
Я обновил решение, которое передает аргументы с частью маршрута, это может помочь, если вы примете передачу значения с маршрутом
Недавно я столкнулся со случаем, связанным с routedata, поэтому я придумал решение routedata, надеюсь, оно поможет stackoverflow.com/questions/75410483/…
Еще одна вещь, если вы не возражаете? Как выглядит ваш cshtml? Я написал свою форму без [BindProperty], но я вижу из вашего видео, что вы сделали это по-другому - и я предполагаю, что ваш способ лучше, чем мой, поэтому мне любопытно... :-)
Я только что попытался воспроизвести ошибку с помощью жесткого кодирования, [BindProperty(SupportGet = "true")] attr позволяет вам привязать свойство модели страницы, когда вы нажимаете метод onget, поэтому мне не нужно снова писать аргументы, я просто привык к этому
Предыстория информация.