Бритва, две формы, одно поле - PullRequest
0 голосов
/ 21 марта 2019

Форма 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.

Другой вариант - использовать сценарии на стороне клиента для копирования значения из одного поля в другое. Но я не вижу, как это сделать, когда имя параметра в методе контроллера одинаково для обоих полей на стороне клиента.

Каков наилучший способ справиться с этим, пожалуйста?

1 Ответ

0 голосов
/ 23 марта 2019

У меня есть решение, но я не могу не думать, что должен быть лучший способ.

FWIW, это то, что я сделал.Два поля имеют неидентичные имена (но схожие).«Основная» версия (видимый флажок) содержит скрипт, который копирует значение в «подчиненную» версию (скрытое поле) при отправке.Метод контроллера принимает обоих имен и решает, какое из них уместно - одно или оба должны быть нулевыми, но оба не должны иметь значения, но мы обрабатываем это на всякий случай.

Наконец,контроллер возвращает представление с объединенным значением (используя идентификатор «master»).

View - форма 1:

bool excludeThrough = ViewBag.ExcludeThrough != null ? ViewBag.ExcludeThrough : false;

@Html.CheckBox("ExcludeThrough", excludeThrough, new
{
    @class = "form-control",
    onchange = "document.getElementById('ExcludeThroughFilter').value = document.getElementById('ExcludeThrough').value;"
})

View - форма 2:

@Html.Hidden("ExcludeThroughFilter", excludeThrough)

Контроллер:

public ActionResult PlatformGridEdit(..., bool? excludeThrough, bool? excludeThroughFilter)
{
    bool excThru = false;
    if (excludeThrough.HasValue) excThru = excludeThrough.Value;
    if (excludeThroughFilter.HasValue && excludeThroughFilter.Value) excThru = true;
    ...etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...