C# 什么';当DevExpress MVC GridView扩展绑定到System.Data.DataTable对象时,是否将模型发布到创建/编辑操作?

C# 什么';当DevExpress MVC GridView扩展绑定到System.Data.DataTable对象时,是否将模型发布到创建/编辑操作?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,devexpress,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Devexpress,我在ASP.NET MVC 4项目中使用了DevExpressGridView扩展v12.2 GridView的DataSource设置为System.Data.DataTable对象,该对象是通过在SQL Server 2008 R2数据库上运行自定义SQL查询获得的 我绑定到DataTable的原因是,每次运行SQL查询的结果都会有可变的列数,因此结果的模式是流动的。因此,我无法绑定到特定的ViewModel或IEnumerable,因为为此,我必须先有一个固定的结构 我查了一下,DataT

我在ASP.NET MVC 4项目中使用了DevExpress
GridView
扩展v12.2

GridView
DataSource
设置为
System.Data.DataTable
对象,该对象是通过在SQL Server 2008 R2数据库上运行自定义SQL查询获得的

我绑定到
DataTable
的原因是,每次运行SQL查询的结果都会有可变的列数,因此结果的模式是流动的。因此,我无法绑定到特定的ViewModel或
IEnumerable
,因为为此,我必须先有一个固定的结构

我查了一下,
DataTable
竟然不是
IEnumerable
。它是一个
IListSource
。但是

我使用以下代码来处理行编辑、删除和新行创建:

@Html.DevExpress().GridView(settings =>
    {
    settings.Name = "gvStrings";

    settings.CallbackRouteValues = new { Controller = "Strings", Action = "StringsPartial" };

    // Paging related stuff: not shown here 
    // because it's not relevant to the question

    foreach (DataColumn column in Model.Columns)
    {
        if ((string.Compare(column.ColumnName, "Foo", true) == 0) ||
            (string.Compare(column.ColumnName, "Bar", true) == 0))
        {
            continue;
        }
        else if (string.Compare(column.ColumnName, "GarId", true) == 0)
        {
            var categoryColumn = settings.Columns.Add(column.ColumnName, "Gar");

            // and so on...
        }
        else
        {
            settings.Columns.Add(column.ColumnName);
        }
    }

    settings.KeyFieldName = "FooId";

    settings.SettingsEditing.AddNewRowRouteValues = new { Controller = "Foo", Action = "CreateNew" };
    settings.SettingsEditing.UpdateRowRouteValues = new { Controller = "Foo", Action = "Edit" };
    settings.SettingsEditing.DeleteRowRouteValues = new { Controller = "Foo", Action = "Delete" };

    settings.SettingsEditing.Mode = GridViewEditingMode.Inline;

    settings.SettingsBehavior.ConfirmDelete = true;

    settings.CommandColumn.Visible = true;
    settings.CommandColumn.NewButton.Visible = true;
    settings.CommandColumn.EditButton.Visible = true;
    settings.CommandColumn.UpdateButton.Visible = true;
    settings.CommandColumn.DeleteButton.Visible = true;

}).Bind(Model).GetHtml()
我无法确定从客户端发送的数据绑定到服务器上的对象类型

我尝试像这样绑定到
System.Data.DataRow
,但是模型绑定器无法绑定到
DataRow
对象,因为
DataRow
没有无参数的默认构造函数

[HttpPost]
public ActionResult CreateNew(DataRow row)
{
    System.Diagnostics.Debugger.Break();

    // The model binder can't bind to System.Data.DataRow because
    // DataRow does not have a parameterless, default ctor, so 
    // I receive an exception that says something like, 
    // "No parameterless default constructor was found on this object."

    return Content("Hello, there!");
}
然后,我尝试在签名中使用
System.object
,并调用其
GetType()
返回运行时类型,但它只返回
System.object
作为运行时类型。请参阅下面的代码:

[HttpPost]
public ActionResult CreateNew(object row)
{
    System.Diagnostics.Debugger.Break();

    System.Diagnostics.Debug.Print(row.GetType().ToString());

    return Content("Hello, there!");
}
然后,我尝试像这样绑定到一个
动态
对象,但我无法反映它的属性

[HttpPost]
public ActionResult CreateNew(dynamic row)
{
    System.Diagnostics.Debugger.Break();

    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(row))
    {
        System.Diagnostics.Debug.Print(prop.Name);
    }

    return Content("Hello, there!");
}

请帮忙。我应该将数据绑定到哪个对象?

检查DevExpress知识库中的线程。

为什么不直接与DevExpress支持部门联系?按下按钮等待时间。就在两件事之间,我没法去做。在这里发帖更省时。谢谢你,米哈伊尔。我已经在您指向的链接中查找了Anthony作为对Marcel查询的响应而发布的示例代码,看起来就是这样。多谢。在我开始编辑操作的数据绑定之前,我仍然有一些问题。这就是我最近与MVC的DevXPress扩展争论的要点。你能帮忙吗?