[英]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.