2012-04-03 2 views
3

Мне нужно передать сложный объект, представляющий фильтр данных, в действие с помощью GET, который возвращает отфильтрованный набор данных в файле csv.ASP.NET MVC: параметры GET должным образом не десериализованы

Объект фильтр что-то вроде этого на клиенте (гораздо более сложным в действительности, упрощенной для краткости):

var filter = { 
    Folders = [ 
    { Positive: true, Reference: { Id: 19, Name: "Container" } }, 
    { Positive: true, Reference: { Id: 37, Name: "Bullseye" } }, 
    ] 
} 

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

public class MyFilter 
{ 
    public List<MyComparison> Folders { get; set; } 
} 
public class MyComparison 
{ 
    public bool Positive { get; set; } 
    public MyReference Reference { get; set; } 
} 
public class MyReference 
{ 
    public int Id { get; set; } 
    public string Name {get; set; } 
} 

Мои действия выглядят так:

[HttpGet] 
public FileContentResult Export(MyFilter filter, string sort, bool sortAscending) 
{ 
    string data = GetCsvData(filter, sort, sortAscending); 
    return this.File(StrToByteArray(data), "text/csv", "Data.csv"); 
} 

Я пробовал называть это действие f rom javascript вот так:

function exportFilter(aFilter) { 
    var params = { filter: aFilter, sort: "Name", sortAscending: true }; 
    var destination = "MyController/Export?" + decodeURIComponent($.param(params)); 
    document.location = destination; 
} 

В рамках действия параметры сортировки и сортировки должным образом заполнены. Фильтр является объектом типа MyFilter, но его свойство Folders равно null.

Является ли ASP.NET MVC должным образом десериализацией сложных параметров таким образом (то есть в контексте GET)? Каков правильный способ решения этой проблемы?

+0

Он способен, но трудно сказать, что именно происходит в вашем случае без отладки ..:/ –

+0

что происходит в aFilter? – Dave

+0

aFilter получает объект javascript, например, «фильтр» из первого примера кода –

ответ

2

Он может связывать сложные объекты/параметры, проблема в том, как отправляются параметры. Например, вы отправляете:

http://localhost/Home/Export?filter[Folders][0][Positive]=true&filter[Folders][0][Reference][Id]=19&filter[Folders][0][Reference][Name]=Container&filter[Folders][1][Positive]=true&filter[Folders][1][Reference][Id]=37&filter[Folders][1][Reference][Name]=Bullseye&sort=Name&sortAscending=true 

Но модель связующий MVC ожидает следующий формат:

http://localhost/Home/Export?filter.Folders[0].Positive=true&filter.Folders[0].Reference.Id=19&filter.Folders[0].Reference.Name=Container&filter.Folders[1].Positive=true&filter.Folders[1].Reference.Id=37&filter.Folders[1].Reference.Name=Bullseye&sort=Name&sortAscending=true 

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

3

Алгоритм привязки данных в Asp.net MVC не очень хорош в десериализации сложных входов в .NET-типах. В лучшем случае вы получите некоторые странные результаты и/или медленную производительность по сравнению с другими специализированными решениями. В этом случае Json.NET обеспечивает гораздо лучшие результаты при десериализации json-данных в .NET-типах и очень быстро.

Вы должны передать эти фильтры, как обычный строковый параметр, и внутри действия десериализовать его с помощью Json.NET. Что-то вроде этого:

using Newtonsoft.Json; 

public ActionResult MyAction(string myFilters) 
{ 
    var deserializedObject = JsonConvert.DeserializeObject(myFilters); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^