アップデート
DefaultModelBinder の機能を読んだ後、投稿データに問題があることがわかりました。
まず、フィルター プロパティのクラスを次のように変更します。
public IList<FilterRequest> filter { set; get; } //(IList<T> instead of List<T>)
DefaultModelBinder が正しくバインドするクエリ文字列を次に示します。
start=0&limit=5&dir=ASC&sort=noSort&filter[0].field=CompanyName&filter[0].data.type=string&filter[0].data.value=Telus&filter[1].field=VendorName&filter[1].data.type=string&filter[1].data.value=testtest
しかし、js は次のクエリ文字列を生成しています。
start=0&limit=5&dir=ASC&sort=noSort&filter[0][field]=CompanyName&filter[0][data][type]=string&filter[0][data][value]=Telus&filter[1][field]=VendorName&filter[1][data][type]=string&filter[1][data][value]=testtest
独自の ModelBinder クラスを実装できるようになりましたが、クライアント側でオブジェクトをシリアル化する方が簡単だと思います。コンテンツ タイプが適切に設定されていることを確認してください。jquery で作成した例を次に示します。
<script type="text/javascript">
$(function () {
$("#btnSendPost").click(function () {
var filterData = {
"start": 0, "limit": 5,
"dir": "ASC", "sort": "noSort",
"filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
{ "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
$.ajax({
type: "POST",
url: "/Home/ReceivePostFromJson",
data: JSON.stringify(filterData),
dataType: "json",
contentType: 'application/json; charset=utf-8'
});
});
});
</script>
次に、global.asax ファイルの Application_Start メソッドに次の行を追加するだけです。
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
そうすれば、フレームワークはモデルを正しくバインドし、アクション メソッドでオブジェクトを受け取ります
[HttpPost]
public ActionResult ReceivePostFromJson(GetPagedRequest g)
{
元の回答
フィルター データを送信する前に、コントロールから json を文字列化できる場合は、JavaScriptSerializer を使用してオブジェクトを逆シリアル化できます。
この例は jquery で作成されています。
<script type="text/javascript">
$(function () {
$("#btnSendPost").click(function () {
var filterData = {
"start": 0, "limit": 5,
"dir": "ASC", "sort": "VendorName",
"filter": [{ "field": "CompanyName", "data": { "type": "string", "value": "Telus" } },
{ "field": "VendorName", "data": { "type": "string", "value": "testtest" } }]};
$.ajax({
type: "POST",
url: "/Home/ReceivePostFromJson",
data: JSON.stringify(filterData),
dataType: "application/json"
});
});
});
</script>
次に、コントローラーで:
[HttpPost]
public ActionResult ReceivePostFromJson()
{
string jsonStringify = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
var obj = new JavaScriptSerializer().Deserialize<GetPagedRequest>(jsonStringify);
return View(obj);
}
そうすれば、ネストされたオブジェクトがあります。
注: この例では、関数 JSON.stringify (data: filterData,) を削除すると、問題を引き起こすクエリ文字列 (filter[0][field]: CompanyName) がコントローラー側に表示されます。json を復元する方法があるかどうかはわかりません。可能であれば、グリッド コントロールを変更する必要はありません。