Публикация сложного объекта LINQ-to-SQL в ASP.NET MVC Controller - PullRequest
1 голос
/ 25 января 2010

Я могу отправить сложный объект на контроллер 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 (), как видно здесь .

1 Ответ

0 голосов
/ 25 января 2010

Вот пример исправления, о котором я говорил в своем вопросе. Это работает, но должно быть реализовано для всех подобных свойств.

«Сгенерированный» класс домена LINQ-to-SQL

public partial class Table
{
    public string Name { get; set; }
    public EntitySet<Column> Columns { get; set; }
}

Частичный класс со свойством jQuery-friendly массив

public partial class Table
{
    public Column[] ColumnsIn
    {
        get
        {
            // ASP.NET MVC requires a getter in all bound properties, but the returned value isn't used in this case
            return null;
        }
        set
        { 
            Columns = new EntitySet < Column > ();
            Columns.AddRange ( value );
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...