Я могу отправить сложный объект на контроллер ASP.NET MVC с помощью jQuery, если я изменяю вывод $ .param () следующим образом: "Column [0] [Name]" -> " Колонка [0] .Name "
Однако это работает только в том случае, если данные привязаны к свойству типа массива на сервере (Columns1 в приведенном ниже примере). Тип коллекции, такой как IEnumerable или EntitySet, используемый LINQ-to-SQL, не работает.
Должен ли я просто определить свойство типа массива только для записи, которое устанавливает свойство EntitySet для привязки, или есть более элегантное решение?
JavaScript
var columns =
[
{ Name: 'Alpha', Width: 50 },
{ Name: 'Bravo', Width: 100 },
{ Name: 'Charlie', Width: 75 }
];
var params = $.param(
{
Name: 'MyTable',
Columns1: columns,
Columns2: columns,
Columns3: columns
} );
params = params.replaceAll( '%5BName%5D=', '%2EName=' );
params = params.replaceAll( '%5BWidth%5D=', '%2EWidth=' );
$.post( $.getUrl( '/MyController/CreateTable/' ),
params,
function()
{
$.log( 'done' );
} );
Доменные классы
public class Table
{
public string Name { get; set; }
public Column[] Columns1 { get; set; }
public IEnumerable<Column> Columns2 { get; set; }
public EntitySet<Column> Columns3 { get; set; }
}
public class Column
{
public string Name { get; set; }
public int Width { get; set; }
}
Действие контроллера
public ActionResult CreateTable( Table table )
{
// table.Columns1 contains a list of three Columns, with Name and Width set properly
// table.Columns2 and table.Columns3 both contain three Column objects, but Name and Width are null/0
}
EDIT
Заменена строковая функция replace () на replaceAll (), как видно здесь .