0

jqueryとajaxを使用して検索を行い、ページを更新するMVC4アプリに取り組んでいます。通常、検索するには、javascript オブジェクトを作成し、それを ApiController に投稿します。ここで、投稿パラメーターが .NET 検索入力オブジェクトにマップされます。

同じ JavaScript 検索オブジェクトをサーバーに送信する必要がありますが、GET 要求として送信する必要があるため、$.param() を使用してオブジェクトをシリアル化しています。

クエリ文字列を .NET 検索入力オブジェクトに逆シリアル化する簡単な方法はありますか?

作成されるクエリ文字列の簡略化されたバージョンを次に示します。

Search[ListId]=41&Search[Query]=test&Search[SortBy]=Location&Search[SortDirection]=Descending&Search[UserTypes][]=2&Search[UserTypes][]=5&Search[UserTypes][]=9&Export[PDF]=false&Export[XLS]=true&Export[XML]=true

Ands は、逆シリアル化しようとしている SearchInput オブジェクトです。

public class SearchInput
{
    public Search Search { get; set; }
    public Export Export { get; set; }
}

public class Search
{
    public int ListId { get; set; }
    public string Query { get; set; }
    public ListViewConfig.SortBy SortBy { get; set; }
    public SortDirection SortDirection { get; set; }
    public List<int> UserTypes { get; set; }
}

public class Export
{
    public bool PDF { get; set; }
    public bool XLS { get; set; }
    public bool XML { get; set; }
}

SortBy と SortDirection は列挙型です。

4

1 に答える 1

0

さて、私は自分の問題を解決しましたが、 $.param() を取り除きました

オブジェクトを json でエンコードし、それを uri エンコードして、全体をクエリ文字列パラメーターとしてコントローラー アクションに送信します。

var data = { Search: searchInput, Export: exportInput };
var url = "/ListViews/Export/";
var json = encodeURIComponent(JSON.stringify(data));
var fullUrl = url + "?json=" + json;

次に、コントローラーで JsonConvert.DeserializeObject を使用して、json を .NET オブジェクトにマップします。

var o = JsonConvert.DeserializeObject<ExportObject>(json);

.NET クラス:

public class ExportObject
{
    public ListViewsApiController.SearchInput Search { get; set; }
    public ExportInput Export { get; set; }
}

public class ExportInput
{
    public bool PDF { get; set; }
    public bool XLS { get; set; }
    public bool XML { get; set; }
}

public class SearchInput
{
    public int ListId { get; set; }
    public string Query { get; set; }
    public ListViewConfig.SortBy SortBy { get; set; }
    public SortDirection SortDirection { get; set; }
    public List<int> UserTypes { get; set; }
}
于 2013-06-20T10:54:45.300 に答える