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

StackOverflow https://stackoverflow.com/questions/295200

  •  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"] }
                   ) %>
&nbsp;

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 или что-то в этом роде?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top