Как передать список объектов из вида в действие контроллера в asp.net mvc3 - PullRequest
2 голосов
/ 02 июня 2011

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

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

  public ActionResult BeginSearch(SearchHomeVM searchParameters)
      {
         var search = new Search(searchParameters);
         linije = search.PretraziLinije();

         return PartialView("_searchResult", linije);
       }

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

  @model LinijeSearchResult
  @if (Model.BrojDirektnihLinija > 0)
  {
  <table id="direktneLinije" class="InvisibleTable">
    <thead>
        <tr>
            <th>
                Direktne linije
            </th>
            <th>
            </th>
        </tr>
    </thead>
    @for (int index = 0; index < Model.DirektneLinije.Count; index++)
    {
        LinijaSM item = Model.DirektneLinije[index];
        List<LinijaSM> lin = new List<LinijaSM> { item };
        <tr>
            <td>@item.Naziv
            </td>
            <td>
                @using (Ajax.BeginForm("RenderStanice",
                    new { psd = 0, index = index, lin = lin },
                    new AjaxOptions
                    {
                        HttpMethod = "POST",
                        UpdateTargetId = "staniceLinije",
                        InsertionMode = InsertionMode.Replace
                    }))
                {
                    <input type="submit" value="Stanice" />
                }
            </td>
        </tr>
    }
   </table>

   }
   else
   {
    <text>Nema direktnih linija za odabrane parametre.</text>
    <br />
   }

Здесь Вы можете увидеть, как я пытаюсь передать данные в действие контроллера, которое выглядит так:

    public ActionResult RenderStanice(List<LinijaSM> lin)
    {
        return PartialView("_staniceSR", lin);
    }

В этом действии контроллера я получаюпустой списокМожете ли вы посоветовать, пожалуйста, как это сделать?

<< РЕДАКТИРОВАТЬ >>

До этого момента я выяснил, что Список любого объекта не можетбыть переданы обратно контролеру.То же самое касается сложных объектов.Я могу передать целое число, но не список целых чисел.

Может кто-нибудь посоветовать мне, как достичь моей цели?Мне нужно передать список объектов обратно в контроллер.Можно ли это сделать, добавив его в контекст, создав новый viewData или что-то в этом роде?

Если это невозможно, можно ли частично отобразить представление через AJAX, но без действия контроллера?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

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

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

0 голосов
/ 04 июня 2011

Мое текущее решение этой проблемы - временно сохранить данные в сеансе.

        linije = search.PretraziLinije();
        Session["direktneLinije"] = linije.DirektneLinije;
        Session["jednoPresjedanjeLinije"] = linije.LinijeUzJednoPresjedanje;
        Session["dvaPresjedanjaLinije"] = linije.DirektneLinije;

и передавать туда и обратно только индекс поля для доступа к соответствующим данным.

    @for (int index = 0; index < Model.DirektneLinije.Count; index++)
    {
        LinijaSM item = Model.DirektneLinije[index];
        <tr>
            <td>@item.Naziv
            </td>
            <td>
                @using (Ajax.BeginForm("RenderStanice",
                    new { index, bpr = 0 },
                    new AjaxOptions
                    {
                        HttpMethod = "POST",
                        UpdateTargetId = "staniceLinije",
                        InsertionMode = InsertionMode.Replace
                    }))
                {

                    <input type="submit" value="Stanice" />
                }
            </td>
        </tr>
    }

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

Если кто-нибудь1 может предложить лучшее решение, пожалуйста, сделайте.

...