Как передать несохраняемый измененный объект из представления обратно в контроллер без формы?
-
08-07-2019 - |
Вопрос
Короткий: как привязка модели передает объекты из представления в контроллер?
Длинный:
Сначала на основе параметров, заданных пользователем через форму поиска, из базы данных извлекаются некоторые объекты.Этим объектам предоставляются метаданные, которые видны (но не определяют) клиенту (например:наименование и стоимость объектов различаются от региона к региону).
Позже на сайте пользователь может щелкнуть ссылки, которые должны показать подробную информацию об этих объектах.Поскольку эти метаданные важны для отображения, но не для определения, мне нужно вернуть ранее измененный объект в контроллер.Когда я использую привязку модели asp.net mvc по умолчанию, используется метод .ToString().Это, конечно, не возвращает соответствующую строку для воссоздания полного объекта.
Я бы подумал, что здесь будет задействован интерфейс ISerializable, но это не так.Как мне действовать, чтобы получить желаемый эффект?Не могу себе представить, что я первый, кто столкнулся с этим вопросом, поэтому, наверное, я где-то что-то упускаю...
Решение
Привязка модели по умолчанию принимает параметры формы по имени и сопоставляет их со свойствами типа, указанного в списке аргументов. Например, ваша модель имеет свойства "Цена" и " Имя " ;, тогда форма должна содержать входные данные с идентификаторами / именами " Цена " и " Имя " (Я подозреваю, что это соответствует регистронезависимому совпадению) Связыватель использует отражение, чтобы преобразовать значения формы, связанные с этими ключами, в соответствующий тип и назначить его свойствам вновь созданного объекта типа, указанного параметром (снова полученного путем отражения).
Вы можете посмотреть (и загрузить) источник для этого по адресу http://www.codeplex.com / aspnet , хотя оттуда вам придется углубиться в источник MVC. Я бы дал ссылку на источник DefaultModelBinder, но, как они построены, я считаю, что ссылка меняется по мере появления ревизий.
Итак, чтобы ответить на ваш вопрос, вы должны иметь в своей форме параметры (которые могут быть скрыты), соответствующие свойствам объекта, который вы хотите воссоздать. Когда вы отправляете форму (в представлении) в контроллер, связыватель должен воссоздать объект указанного типа, используя параметры формы. Если вам необходимо выполнить перевод значений в параметре формы в свойства объекта, вам, вероятно, потребуется реализовать собственный настраиваемый механизм связывания модели.
[РЕДАКТИРОВАТЬ] В ответ на ваше второе сообщение:
Допустим, мы хотим получить ссылку на действие, которое использует настроенный объект. Мы можем сохранить настроенный объект в TempData (или в сеансе, если нам нужно, чтобы он длился более чем через одну обратную передачу) с определенным ключом. Затем мы можем создать ссылку действия и предоставить ключ объекта в качестве значения для ActionLink в анонимном классе. Это вернет ключ в качестве параметра запроса. В нашем действии мы можем использовать ключ из этого параметра для извлечения объекта из TempData.
<%= Html.ActionLink( ViewData["CustomObject1",
"Select",
new { TempDataKey = ViewData["CustomObject1_Key"] }
) %>
public ActionResult Select()
{
Entity custObj = null;
string objKey = Request.Params["TempDataKey"];
if (!string.IsNullOrEmpty(objKey))
{
custObj = (Entity)TempData[objKey];
}
... continue processing
}
Другие советы
@tvanfosson
Спасибо за объяснение, а как насчет ссылок?(Нет форм вовлечены) В настоящее время HTML.ActionLink (c => C.Action (параметр), «метка») принимает объекты в качестве параметра.Их необходимо перевести на части URL.Для этого MVC ВСЕГДА обращается к методу .ToString().Я не хочу сериализовать свой объект в методе ToString.
Разве я не должен каким-то образом помочь платформе сериализовать мой объект?Скажем, через интерфейс ISerialize или что-то в этом роде?