Я использую модель, которая содержит список в качестве свойства. Я заполняю этот список элементами, полученными с SQL Server. Я хочу, чтобы список был скрыт в представлении и передавался действию POST. Позже я, возможно, захочу добавить больше элементов в этот список с помощью jQuery, что сделает массив непригодным для дальнейшего расширения. Обычно вы использовали бы
@Html.HiddenFor(model => model.MyList)
для выполнения этой функции, но по какой-то причине список в POST всегда равен нулю.
Очень простой вопрос, кто-нибудь знает, почему MVC так себя ведет?
c#
asp.net
asp.net-mvc-3
hidden-field
Антон Смит
источник
источник
<input />
s?MyList
содержит?HiddenFor
используется только для одного входа за раз.Model.MyList
? Возможно, вам потребуется выполнить некоторую сериализацию / десериализацию в вашем списке вручную.Ответы:
Я только что столкнулся с этой проблемой и решил ее, просто выполнив следующие действия:
При использовании for вместо foreach привязка модели будет работать правильно и собирать все ваши скрытые значения в списке. Кажется, самый простой способ решить эту проблему.
источник
@Html.HiddenFor(model => Model.ToGroups[i].RowId)
@Html.EditorFor(model => Model.ToGroups[i].Id)
за которым следует@Html.EditorFor(model => Model.ToGroups[i].Description)
в следующий раз - оба в цикле for. И контроллер смог сопоставить его со списком моделей с этими полями. И чтобы ничего из этого не отображалось на экране, просто окружите его<div style="display: none;"></div>
for
-loop на это:for(int i = 0; i < Model.Departments.Count(); i++)
HiddenFor не похож на DisplayFor или EditorFor. Он не будет работать с коллекциями, только с отдельными значениями.
Вы можете использовать помощник Serialize HTML, доступный в проекте MVC Futures, для сериализации объекта в скрытое поле, или вам придется написать код самостоятельно. Лучшее решение - просто сериализовать какой-либо идентификатор и повторно получить данные из базы данных при обратной передаче.
источник
Это немного рубить, но если
@Html.EditorFor
и@Html.DisplayFor
работают для вашего списка, если вы хотите , чтобы убедиться , что он послал на запрос пост , но не видно, вы могли бы просто стиль его использования ,display: none;
чтобы скрыть это вместо того, чтобы , например:источник
Как насчет использования Newtonsoft для десериализации объекта в строку json, а затем вставки ее в свое скрытое поле, например ( Model.DataResponse.Entity.Commission - это список простых объектов «CommissionRange», как вы увидите в JSON)
Отображается как:
В моем случае я делаю некоторые вещи JS, чтобы редактировать json в скрытом поле перед отправкой обратно
Затем в своем контроллере я снова использую Newtonsoft для десериализации:
источник
Html.HiddenFor
рассчитан только на одно значение. Вам нужно будет каким-то образом сериализовать ваш список перед созданием скрытого поля.Например, если ваш список имеет строковый тип, вы можете объединить его в список, разделенный запятыми, а затем разделить список после отправки обратно в свой контроллер.
источник
Я только что узнал (после нескольких часов попыток выяснить, почему значения модели не возвращаются в контроллер), что скрытые для должны следовать за EditorFor.
Если я не делаю что-то еще не так, это то, что я обнаружил. Я больше не совершу ошибку.
В контексте модели, содержащей список другого класса.
Это не будет работать:
Где как это БУДЕТ ......
источник
Я начал копаться в исходном коде
HiddenFor
и думаю, что препятствие, которое вы видите, состоит в том, что ваш сложный объектMyList
не может быть неявно преобразован в типstring
, поэтому фреймворк обрабатывает вашеModel
значение какnull
и отображаетvalue
атрибут пустым.источник
Вы можете взглянуть на это решение .
Поместите только HiddenFor в EditorTemplate.
И в вашем представлении поместите это:
@Html.EditorFor(model => model.MyList)
Должно работать.
источник
Столкнулся с той же проблемой. Без цикла for он отправил только первый элемент списка. После прохождения цикла for он может сохранить полный список и успешно публиковать сообщения.
источник
Другой вариант:
источник
foreach
Петли вместоfor
петли может быть немного чище раствор.источник
Другой возможный способ исправить это - присвоить каждому объекту в вашем списке идентификатор, а затем использовать
@Html.DropDownListFor(model => model.IDs)
и заполнить массив, содержащий идентификаторы.источник
возможно, поздно, но я создал метод расширения для скрытых полей из коллекции (с элементами простого типа данных):
Итак, вот оно:
Использование очень простое:
источник