Как MVC решает, какое значение связать, когда существует несколько входов с одинаковым именем? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть страница редактирования, где несколько полей условно отключены в зависимости от роли пользователя.Когда поля отключены, их значения не публикуются на сервере (как и ожидалось), что приводит к тому, что ModelState является недействительным, поскольку значения являются обязательными.

Чтобы обойти это, я хочу добавить HTML.HiddenFor () для полей;чтобы значение по-прежнему публиковалось (и чтобы оно сохраняло эти значения в случае возврата представления).Однако, в случае, если эти поля не отключены, я получу и TextBoxFor, и HiddenFor, переходящие к одному и тому же свойству модели.

Я провел пару тестов, и кажется, что когда это происходит,значение первого элемента формы будет привязано к модели, а следующий элемент просто игнорируется.Если это так, то я смогу просто поставить HiddenFor после TextBoxFor, и в этом случае значение скрытого ввода будет опубликовано только тогда, когда обычный ввод отключен.

@Html.TextBoxFor(m => m.FirstName)
@Html.HiddenFor(m => m.FirstName) @*Only gets binded to the model if the above text box is disabled*@

(Существует некоторый JavaScript, который условно отключил видимое TextBox).

Итак, два вопроса: 1) задокументировано ли, что привязка MVC всегда будет работать таким образом;могу ли я безопасно иметь оба этих поля?

И, 2) Есть ли лучший подход для достижения этой цели?Я знаю, что могу использовать HiddenFor внутри оператора @If, чтобы он создавался только в том случае, если TextBox отключен;но в View это много лишней логики, которую я бы хотел избежать.

1 Ответ

0 голосов
/ 13 сентября 2018

DefaultModelBinder читает значения из запроса по порядку и связывает первую совпадающую пару имя / значение и игнорирует последующие совпадения (если свойство не равно IEnumerable). Таким образом, метод CheckBoxFor() гарантирует, что значение true или false всегда отправляется на контроллер (метод создает флажок с value="True" и скрытый ввод с value="False"), так что вы можете безопасно добавить скрытый ввод после текстового поля.

Один вариант, который вы могли бы рассмотреть вместо отключенного текстового поля, это сделать его readonly, что означает, что оно всегда будет передавать значение, поэтому вам нужен только один ввод (и вы всегда можете стилизовать его так, чтобы он выглядел отключенным, если это что хочешь).

...