Как передать необращенный измененный объект из представления обратно в контроллер без формы? - PullRequest
0 голосов
/ 17 ноября 2008

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

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

Ответы [ 2 ]

2 голосов
/ 17 ноября 2008

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

На самом деле вы можете посмотреть (и загрузить) источник для этого по адресу 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
}
0 голосов
/ 17 ноября 2008

@ tvanfosson

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

...