将复杂的LINQ-to-SQL对象发布到ASP.NET MVC Controller

时间:2010-01-25 18:51:18

标签: jquery asp.net-mvc linq-to-sql

我可以使用jQuery将复杂对象发布到ASP.NET MVC控制器,只要我修改$ .param()的输出,如下所示:“Column [0] [Name]” - > “列[0]请将.Name”

但是,这仅在数据绑定到服务器上的数组类型属性(下例中的Columns1)时才有效。像IEnumerable这样的集合类型或LINQ-to-SQL使用的EntitySet都不起作用。

我应该简单地定义一个只写的数组类型属性来设置绑定时的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
}


修改

将replace()字符串函数替换为replaceAll(),如here所示。

1 个答案:

答案 0 :(得分:0)

以下是我在问题中提到的修复示例。它可以工作,但需要为所有类似的属性实现。

“生成的”LINQ-to-SQL域类

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

具有jQuery友好数组属性的部分类

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