簡體   English   中英

將對象列表傳遞給控制器​​(C#MVC)

[英]Passing object list to controller (C# MVC)

我的下一個控制器帶有參數:controlador,mostrarBorrados,listaFiltrosSeleccionados,cantRegistros和reportType。

[HttpGet]
public ActionResult GetReport(string controlador, bool mostrarBorrados, List<FiltroSeleccionado> listaFiltrosSeleccionados, int? cantRegistros, string reportType)
{

    //...

    return File(renderedBytes, mimeType);
}

我用下一個ajax代碼來稱呼它:

$.ajax({
url: '@Url.Action("GetReport", "Report")',
type: 'GET',
dataType: 'binary',
data: { controlador: "condIva", mostrarBorrados: mostrarBorrados,
    listaFiltrosSeleccionados: listaFiltrosSeleccionados, cantRegistros : cantRegistros, reportType: "EXCELOPENXML" },
success: function (response) {
    var url = URL.createObjectURL(response);
    var $a = $('<a />', {
        'href': url,
        'download': 'descarga.xlsx',
        'text': "click"
    }).hide().appendTo("body")[0].click();
}});

該文件已正確生成,但是問題出在“ listaFiltrosSeleccionados”參數上。 它到達“空”,就像下一個圖像:

捕獲

我究竟做錯了什么? 我嘗試了不同的方式,但是它不起作用(我放了HttpPost,使用了stringify等)

謝謝!

我認為MVC無法將接收到的數據轉換為List<FiltroSeleccionado> 使用模型綁定器將數據轉換為模型。

public class FiltroSeleccionadoCollectionModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{

    if (bindingContext == null)
    {
        throw new ArgumentNullException(nameof(bindingContext));
    }

    if (bindingContext.ModelMetadata.ModelType == typeof(DateTime))
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var str = valueProviderResult.AttemptedValue;

        //convert str to List<FiltroSeleccionado> and return it;
    }

    return null;
}

您可以將操作方法​​更改為:

public ActionResult GetReport(string controlador, 
                              bool mostrarBorrados, 
[ModelBinder(typeof(FiltroSeleccionadoCollectionModelBinder))]List<FiltroSeleccionado>
                              listaFiltrosSeleccionados, 
                              int? cantRegistros,
                              string reportType)
{
//...
}

或在啟動時設置以下代碼:

 ModelBinders.Binders.Add(typeof(List<FiltroSeleccionado>), new FiltroSeleccionadoCollectionModelBinder());

MVC無法正確綁定listaFiltrosSeleccionados參數,因為jQuery以一種方式序列化對象數組,而ASP.NET MVC希望以另一種方式序列化對象。

jQuery像這樣序列化: listaFiltrosSeleccionados[0][campo]=foo
ASP.NET MVC希望它是: listaFiltrosSeleccionados[0].campo=foo

在這里您可以詳細了解此問題。 您還可以在其中找到jQuery修補程序,該修補程序為jQuery序列化帶來了對點符號的支持: https : //gist.github.com/migimunz/61557b7fab233604ba46

因此,您可以在腳本中包含此修補程序,並通過以下方式將數據發送到服務器:

var mostrarBorrados = true;
var cantRegistros = 1;
var listaFiltrosSeleccionados = [{
    campo: 'foo',
    opcionSeleccionado: 'bar',
    tabla: 't1',
    valor1: 'v1',
    valor2: 'v2'
}, {
    campo: 'abc',
    opcionSeleccionado: 'def',
    tabla: 't2',
    valor1: 'vlr1',
    valor2: 'vlr2'
}];

function buttonClick() {
    $.ajax({
    url: '@Url.Action("GetReport", "Report")',
        type: 'GET',
    dataType: 'binary',
    data: $.param({ controlador: "condIva", mostrarBorrados: mostrarBorrados,
        listaFiltrosSeleccionados: listaFiltrosSeleccionados, cantRegistros : cantRegistros, reportType: "EXCELOPENXML" }, false, true),
    success: function (response) {
        var url = URL.createObjectURL(response);
        var $a = $('<a />', {
            'href': url,
            'download': 'descarga.xlsx',
            'text': "click"
        }).hide().appendTo("body")[0].click();
    }});
}

然后,您的列表將被更正。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM