2008-11-17 3 views
0

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

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

ответ

2

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

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

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

[EDIT] В ответ на ваш второй пост:

Давайте предположим, что мы хотим иметь ссылку на действие, которое использует модифицированный объект. Мы можем сохранить настроенный объект в TempData (или сеанс, если нам нужно, чтобы он продолжался более чем через одну обратную передачу) с определенным ключом. Затем мы можем построить ссылку на действие и предоставить ключ объекта как значение ActionLink в анонимном классе. Это вернет ключ в качестве параметра Request. В нашем действии мы можем использовать ключ из этого параметра для извлечения объекта из 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

Отлично! Это работало как шарм! Я смотрю, как я могу заставить его выглядеть немного менее хак-иш, но пока это работает отлично :) – 2008-11-18 08:26:53

0

@tvanfosson

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

+0

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