Построение сложного объекта шаг за шагом. Где его сохранить? - PullRequest
0 голосов
/ 27 сентября 2010

Я использую ASP.NET MVC.Мое требование состоит в том, чтобы построить сложный объект (объект, состоящий из другого объекта) с помощью пошаговой процедуры, как в мастере.

Каждый зависимый объект должен быть построен на своем шаге и должен быть проверен на своем шаге.Например,

public class ComplexObjectModel {
    public Object1 MyObject1 { get; set; }
    public Object2 MyObject1 { get; set; }
    public Object3 MyObject1 { get; set; }
}

Поскольку у мастера нет встроенных средств, я решил создать 3 класса моделей и 3 строго типизированных частичных представления, связанных с этими моделями.

На каждом шагемоего псевдо-мастера я проверяю объект зависимой модели и устанавливаю свойство сложного объекта на его ссылку.

Я думал сохранить сложный объект внутри ViewData / TempData следующим образом

В действии контроллера

[HttpPost]
public ActionResult MyAction1() {
    ComplexObjectModel com = (ComplexObjectModel)ViewData["ComplexObjectModel"];
    com.MyObject1 = new Object1();
    ViewData["ComplexObjectModel"] = com;
    return PartialView( "MyAction2", com.Object1 );
}

и в представлении

<% using (Html.BeginForm()) { %>
    <%= Html.Hidden("ComplexObjectModel", ViewData["ComplexObjectModel"]) %>

    ... view fields for Object1, Object n ....
<% } %>

Но при этом способе объект не передается назад и вперед между представлением и контроллером, и я имеюЕсли вы вернетесь из представления к следующему действию, оно станет нулевым.

Есть ли способ поддержать это требование?

спасибо за помощь

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Есть несколько способов, которыми я мог бы заняться этим.

Сначала;Я мог бы решить хранить все это в объекте сеанса.Здесь я предполагаю, что модели довольно большие, и поэтому я не хочу, чтобы они сохранялись в представлении и передавались обратно каждый раз, когда я перехожу на следующую страницу.

Second;Я мог бы сохранить их в базе данных, и если мастер не завершил их работу, удалите их как часть фонового процесса.

Единственное, чего я бы не стал делать, - передать сложный объект каждому представлению.Представлению действительно нужно знать что-либо о любом другом представлении в спокойном мире, и поэтому я склонен этого не делать.

Конечно, это означает, что вам нужно выбрать место для хранения данных.Если бы у меня был Большой объект, то я бы выбрал базу данных, а если бы она была довольно маленькой, я бы выбрал объект сеанса.

Как вы уже обнаружили, наличие всех данных для каждого объекта в каждом представлении можетбыть проблематичным.

Однако, если вы полны решимости сделать это способом просмотра, вот что я бы сделал;

  1. Создайте частичное представление, которое работает только с каждым объектомсложная модель.
  2. В каждом представлении включите все три или более частичных представления.
  3. Для каждого частичного представления, которое не является активным участником представления, поместите его вdiv, который скрыт.

По крайней мере тогда, когда вы изменяете или добавляете свойство, вы просто устанавливаете его в частичном виде один раз, а не три раза.Кроме того, если есть ошибка, вы можете показать div и посмотреть, поступают ли данные.

Также каждое поле должно иметь идентификатор ModelName.Property, чтобы контроллер знал, где находится свойство.

<%= Html.TextBox("MyObject1.MyProperty1", value) %>

Тогда в контроллере вы просто делаете, и это с манжеты;

[HttpPost]
public ActionResult MyAction1(ComplexObjectModel complexModel) {
0 голосов
/ 27 сентября 2010

Вы можете взглянуть на MVC Futures Html.Serialize вспомогательный метод , который позволяет сохранять состояние в скрытом поле между действиями контроллера аналогичным образом, как это делают классические WebForms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...