将JS对象数组传递给MVC控制器而不使用模型

时间:2017-07-14 14:27:22

标签: c# ajax asp.net-mvc

我正在尝试集中我们的应用程序中的一个功能。在整个网站中,我们有许多区域,用户可以将表格(Syncfusion网格)导出为ex​​cel。我们遇到的一个问题是,每当用户过滤/排序以维护新的表数据布局时,如果用户确实想要导出,我们必须往返服务器,戳数据库并运行附带的脚本。另一种方法是,每次用户过滤或导出请求时,我们都会发送过滤后的列。

我目前正试图在后一种情况下切换所有这些往返行程,只有在发出请求时才发送数据来减轻一些来回。我想做的是能够将每个网格发送到一个控制器,从数据中可以找出要显示的列。如果控制器接受列表< MODELNAME >,我可以找到目前为止的每个案例。但是,如果我遵循这个案例,我不确定它是否会奏效。我想我可以创建一个接受属性的通用导出模型。需要注意的是,这些表由DB驱动,以限制在需求发生变化时修改它们所需的工作量。要求由我们的客户向我们和我们的客户报告的报告机构设定,因此我们从未真正知道会发生什么变化。更改存储过程中返回的表会自动更新前面的表。这意味着如果该属性以前不存在,则DB的更改将需要对模型进行后续更新。

有足够的背景,我正在尝试向MVC控制器发送一个通用数组,在POC期间,我正在使用已有的功能并尝试修改它。

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

使用jQuery

使用下面的ajax将数据发送到服务器
$.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);
        }
    });

数据看起来像

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

但是当它击中控制器时,无论使用List,Array还是IEnumerable,值都会以{object}的形式返回。我已经尝试不对正在发送的数据进行字符串化,并将数组中的对象数组进行字符串化。在我获取数据的情况下,我只是无法转换为一个对象,我可以访问每个项目发送的数据值。我觉得这应该是微不足道的,但我似乎无法绕过如何去做。我尝试过序列化,反序列化,传递字符串以尝试访问数据。

3 个答案:

答案 0 :(得分:0)

你有两个原始类型参数和一个复合,你可以使用自定义路线为你的行动,如: 控制器/动作/ {名称} / {忽略} 然后重新排序参数:

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);
    }
});

在代码中检索对象后,将其转换为对象列表并对其进行处理。

答案 1 :(得分: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);
    }
});

答案 2 :(得分: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;

});