MVC3 Передача объекта viewmodel с Iqueryable обратно в контроллер - PullRequest
1 голос
/ 21 сентября 2011

У меня есть представление, что я передаю объект viewmodel, который содержит объект IQueryable <>.

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

После того как сетка отфильтрована, я бы хотел, чтобы пользователь мог экспортировать объект Iqueryable в другой метод actionresult контроллера, который затем вызывает другую модель представления, которая экспортирует данные в Excel.

Вот фрагмент представления, вызывающего метод Export actionresult ():

@using (Html.BeginForm("Export", "Home", FormMethod.Post, new { Model }))
{
  <p>
   <input class="button" value="Export to Excel" type="submit" />
  </p>

}

Модель содержит объект IQueryable.

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

Я также создал другой объект viewmodel, который, как только объект Model передается обратно в метод actionresult, пытается перечислить объект IQueryable, используя метод .ToList () или метод AsEnumerable ().

Но во всех случаях объект IQueryable передается контроллеру как нулевой объект.

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

[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Export(PagedViewModel<NPSProcessed> NPSData)
{
    string message = "";
    NPSData Query = new Models.NPSData(NPSData);

    Query.IData = NPSData.Query.ToList();

        // Opening the Excel template...
        FileStream fs =
        new FileStream(Server.MapPath(@"\Content\NPSProcessedTemplate.xls"),         FileMode.Open, FileAccess.Read);

        MemoryStream ms = new MemoryStream();

        ee.ExportData(fs, ms, Query.IData, message);

        // Sending the server processed data back to the user computer...
        return File(ms.ToArray(), "application/vnd.ms-excel", "NPSProcessedNewFile.xls"); 

    }

Любая помощь будет принята с благодарностью.

Спасибо

Джо

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Вы не можете передавать сложные объекты следующим образом: new { Model }.Это было бы легко :-).Вам придется отправить их по одному:

new { prop1 = Model.Prop1, prop2 = Model.Prop2, ... }

Очевидно, это может быть довольно болезненным.Поэтому я бы порекомендовал вам отправлять только идентификатор:

new { id = Model.id }

, а затем внутри действия вашего контроллера, который должен экспортироваться в Excel, использовать этот идентификатор для извлечения объекта из того места, где вы изначально его выбрали вGET action (предположительно база данных или что-то в этом роде).Если вы хотите сохранить пейджинг и все то, что пользователь мог выполнить в сетке, вы также можете отправить их на сервер:

new { id = Model.id, page = Model.CurrentPage, sortColumn = Model.SortBy }

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

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

1 голос
/ 21 сентября 2011

Простой ответ: не помещайте свойства IQueryable в вашу модель.Модель должна быть чисто простыми объектами и проверочными атрибутами.Сохраняйте возможность запроса в вашем контроллере.

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