2017-07-14 19 views
0

私はアプリケーションの機能の1つを集中化しようとしています。このサイト全体では、ユーザーがテーブル(Syncfusion Grid)をExcelにエクスポートできる多数の領域があります。 1つの問題は、ユーザーが新しいテーブルデータレイアウトを維持するためにフィルタリング/並べ替えを行うたびに、ユーザーがエクスポートしたい場合は、サーバーを往復させ、DBを突き刺して付属のスクリプトを実行する必要があります。これに代わる方法は、ユーザーがフィルターをかけるたびに、またはエクスポート要求でフィルターを適用した列を送信することです。モデルを使用せずにオブジェクトのJS配列をMVCコントローラに渡す

私は現在、これらの往復を、ほとんどの場合、データの送信のみを行うオプションで切り替えようとしていますが、要求が前後に緩和された場合にのみデータを送信します。私がしたいのは、どのグリッドを1つのコントローラーに送ることができるのかです。データから、表示する列を把握することができます。コントローラーがリストを受け入れるなら、私がこれまでに見つけたすべてのケース MODELNAME>しかし、私がこのケースに従えば、うまくいくかどうかわかりません。私は、プロパティを受け入れる一般的なエクスポートモデルを作成できると思います。これは、要件が変更された場合にDBを変更するために必要な作業を制限するために、DBによってこれらのテーブルが駆動されることに注意してください。要件は、クライアントが報告する報告機関によって設定され、私たちもクライアントも報告しないため、変化するものは決して実際にはわかりません。ストアドプロシージャで返されたテーブルを変更すると、前面のテーブルが自動的に更新されます。これは、以前にプロパティが存在しなかった場合、DBへの変更がモデルへの後続の更新を必要とすることを意味する。

十分なバックグラウンド、私は、既存の機能を使用して、それを変更しようとしているPOC中に、MVCコントローラにジェネリックアレイを送信しようとしています。

public void ExportAlertListToExcel(string name, List<object> grid, string ignore = "") 

データは、データが

[ 
{name: 'One', age: '10'}, 
{name: 'Two', age: '12'}, 
{name: 'Three', age: '14'}, 
{name: 'Four', age: '16'}, 
] 

のようになります。しかし、それはコントローラに当たったとき、それの値がするjQueryの

$.ajax({ 
     url: _url, 
     type: "POST", 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify({ 'name': "Filler", 'grid': dataexport }), 
     success: function (data) { 
      // Do something neat 
     }, 
     complete: function() { }, 
     error: function (e) { 
      console.log(e); 
     } 
    }); 

を使用して、以下のAJAXを使用してサーバに送信されますリスト、配列、またはIEnumerableを使用するかどうかにかかわらず、ちょうど{オブジェクト}として戻ってくる。私は送信されているデータをストリング化せず、配列内のオブジェクトの配列をストリング化することを試みました。私はデータを取得する場合、私はちょうど私が項目ごとのデータ値にアクセスできるオブジェクトに変換することはできません文字列を送信します。私はこれが何か些細なものでなければならないと感じていますが、私はそれについてどうやって頭を包むことができないようです。私はシリアライズ、デシリアライズ、文字列を渡してデータにアクセスしようとしました。

+0

コントローラアクションでJObjectを受け入れるとどうなりますか?(私は決して試したことがありません) –

+0

@ Joe_DM私はそれを試して、500エラーを吐き出します。 – TheHamstring

+0

JObjectも失敗しましたが、JArrayはリストのため動作します。私はあなたのサンプルをこのように動作させることができました。 –

答えて

0

使用すると、2つのプリミティブ型パラメータと一つの複合あなたのようなあなたの行動のためのカスタムルートを使用することがあります。 コントローラ/アクション/ {名前}/ を{無視}、その後、あなたのパラメータを並べ替える:

public void ExportAlertListToExcel(string name , string ignore = "",object grid) 

$.ajax({ 
    url: 'contrller/action?name=filler&ignore=c', 
    type: "POST", 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8', 
    data: dataexport, 
    success: function (data) { 
     // Do something neat 
    }, 
    complete: function() { }, 
    error: function (e) { 
     console.log(e); 
    } 
}); 

後にコード内のオブジェクトを取得すると、そのオブジェクトをオブジェクトのリストにキャストしてその上で作業します。

0

JSON配列のデータ型は文字列です。これを試しましたか?

public void ExportAlertListToExcel(string grid) 


$.ajax({ 
    url: 'contrller/action?name=filler&ignore=c', 
    type: "POST", 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8', 
    data: dataexport, 
    success: function (data) { 
     // Do something neat 
    }, 
    complete: function() { }, 
    error: function (e) { 
     console.log(e); 
    } 
}); 
+0

グリッドパラメータは 'raw'と表示されます – TheHamstring

+0

@TheHamstring生のjson文字列がnullの場合、それをデシリアライズすることはできません...私はあなたのように聞こえるようになるでしょうどんなジャンソンも戻って来ない –

0

私はそれが働いて、私のコントローラで私のカスタムオブジェクトの配列として結合持って、これを試してみてください

$('#costRowAdd').click(function() { 
var shipmentCost = { 
    CarrierName: $("#AgentCarrierID").val(), 
    CostName: $("#ShipmentCostLineItems option:selected").html(), 
    Quantity: $("#ShipmentCostqty").val().replace(',', ''), 
    Rate: $("#ShipmentCostrate").val().replace('$', '').replace(',', ''), 
    EstimatedCost: $("#ShipmentCostcharge").val().replace('$', '').replace(',', '') 
} 
var shipmentCosts = []; 
shipmentCosts.push(shipmentCost); 

$.ajax({ 
    url: 'AddShipmentCosts', 
    type: 'POST', 
    dataType: 'json', 
    data: { ShipmentCosts: shipmentCosts, ShipmentNumber: $('#ShipmentNumber').val() }, 
    success: function (data) { 

     LoadShipmentCosts($("#ShipmentNumber").val()); 
     $("#ShipmentCostqty").val(''); 
     $("#ShipmentCostrate").val(''); 
     $("#ShipmentCostcharge").val(''); 

    } 
}); 

return false; 

});

関連する問題