Как передать непостоянный измененный объект из представления обратно в контроллер без формы?

Короткий: как привязка модели передает объекты от представления к контроллеру?

Длинная:
Во-первых, на основе параметров, заданных пользователем через форму поиска, некоторые объекты извлекаются из базы данных. Этим объектам предоставляются метаданные, которые видны (но не определяют) для покупателя (например, названия и цены на объекты различаются от региона к региону). Позже на сайте пользователь может щелкнуть ссылки, которые должны отображать подробную информацию об этих объектах. Поскольку эти метаданные важны для отображения, но не для определения, мне нужно вернуть ранее измененный объект в контроллер. Когда я использую привязку модели asp.net mvc по умолчанию, используется метод .ToString (). Это, конечно, не возвращает соответствующую строку для воссоздания всего объекта. Я бы подумал, что будет задействован интерфейс ISerializable, но это не так. Как мне добиться желаемого эффекта? Не могу представить, что я первый, кто столкнулся с этим вопросом, так что я думаю, что где-то что-то упускаю ...

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
712
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Привязка модели по умолчанию принимает параметры формы по имени и сопоставляет их со свойствами типа, указанного в списке аргументов. Например, ваша модель имеет свойства «Цена» и «Имя», тогда форма должна содержать входные данные с идентификаторами / именами «Цена» и «Имя» (я подозреваю, что это совпадение без учета регистра). Связыватель использует отражение для преобразования значений формы, связанных с этими ключами, в соответствующий тип и назначает его свойствам вновь созданного объекта типа, указанного параметром (снова полученного путем отражения).

Фактически вы можете посмотреть (и загрузить) исходный код для этого по адресу http://www.codeplex.com/aspnet, хотя вам придется перейти к исходному тексту MVC оттуда. Я бы дал ссылку на источник DefaultModelBinder, но я считаю, что способ их построения меняет ссылку по мере внесения изменений.

Итак, чтобы ответить на ваш вопрос, вам необходимо иметь параметры (которые могут быть скрыты) в вашей форме, которые соответствуют свойствам объекта, который вы хотите воссоздать. Когда вы отправляете форму (в представлении) в контроллер, связыватель должен воссоздать объект указанного типа с использованием параметров формы. Если вам нужно выполнить преобразование значений в параметре формы в свойства объекта, вам, вероятно, потребуется реализовать собственное связующее устройство пользовательской модели.

[РЕДАКТИРОВАТЬ] В ответ на ваше второе сообщение:

Допустим, мы хотим иметь обратную ссылку на действие, использующее настраиваемый объект. Мы можем сохранить настроенный объект в TempData (или в сеансе, если нам нужно, чтобы он просуществовал больше, чем через одну обратную передачу) с определенным ключом. Затем мы можем создать ссылку на действие и предоставить ключ объекта как значение для ActionLink в анонимном классе. Это вернет ключ в качестве параметра запроса. В нашем действии мы можем использовать ключ из этого параметра для извлечения объекта из TempData.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

Большой! Это сработало как шарм! Я изучаю, как сделать его менее хакерским, но пока он работает отлично :)

Boris Callens 18.11.2008 11:26

@tvanfosson

Спасибо за объяснение, а как насчет ссылок? (без форм) В настоящее время Html.ActionLink (c => c.Action (параметр), «метка») принимает объекты в качестве параметра. Они должны быть переведены в части URL. Для этого MVC ВСЕГДА переходит к методу .ToString (). Я не хочу сериализовать свой объект в методе ToString. Разве я не могу как-то помочь фреймворку сериализовать мой объект? Скажите через интерфейс ISerialize что ли?

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

Sekhat 17.11.2008 17:50

сохраняя его, вы рискуете ошибками жесткого связывания. Нет? Что, если пользователь сохранит ссылку на детали одного из своих цветов и попытается получить ее на следующий день (сеанс завершен)

Boris Callens 17.11.2008 18:08

Вы должны иметь возможность передавать вещи между действиями с помощью TempData. Я дополню свой ответ этим. Предполагая, что сеанс является поставщиком временных данных, это эквивалентно предложению @Killersponge для небольших объектов.

tvanfosson 18.11.2008 01:27

Другие вопросы по теме