Форма 1 представляет собой набор фильтров, и кнопка «отправить» применяет эти фильтры к методу GET. Форма 2 представляет собой набор данных, и кнопка «отправить» сохраняет эти данные, а также продолжает фильтры с помощью метода POST. Параметры фильтра передаются взад и вперед - пользователь ПОЛУЧАЕТ начальную страницу, возможно устанавливает некоторые фильтры, которые ПОЛУЧАЕТ ту же самую страницу снова с точки зрения метода контроллера, затем пользователь может изменить некоторые данные и сохранить их через POST, который затем возвращает обратно. с GET для той же отфильтрованной страницы.
Упрощенный (намного больше, что, вероятно, не имеет значения):
@model PagedList.IPagedList<xxx.Models.WttPlatformGridRow>
@using (Html.BeginForm("PlatformGridEdit", "Wtt", FormMethod.Get))
{
@Html.CheckBox("ExcludeThrough", (bool)ViewBag.ExcludeThrough)
<input type="submit" value="Filter" />
}
@using (Html.BeginForm("PlatformGridEdit", "Wtt", FormMethod.Post))
{
@Html.Hidden("ExcludeThrough", (bool)ViewBag.ExcludeThrough)
<input type="submit" value="Save" />
}
Упрощенный контроллер:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PlatformGridEdit(List<WttPlatformGridRow> rows, bool? excludeThrough)
{ etc }
public ActionResult PlatformGridEdit(bool? excludeThrough)
{ etc }
Очевидно, что именование двух элементов одинаково недопустимо в HTML, и оно все равно не работает (параметр имеет значение null в методе C #).
Ответы, которые я видел до сих пор, предполагают единый BeginForm со всеми данными. Хорошо. За исключением одного - GET (без изменений данных) и одного - POST (изменения данных). Пользователь должен иметь возможность добавить фильтр в закладки, чтобы я все равно не мог обработать его как POST, в противном случае браузер спросит пользователя, можно ли повторно отправить данные формы.
Я также использую IPagedList, который (насколько я знаю) исключает использование одной модели со списком вместо использования ViewBag.
Другой вариант - использовать сценарии на стороне клиента для копирования значения из одного поля в другое. Но я не вижу, как это сделать, когда имя параметра в методе контроллера одинаково для обоих полей на стороне клиента.
Каков наилучший способ справиться с этим, пожалуйста?