Kendo Grid使用复杂对象进行排序

时间:2015-04-26 12:48:02

标签: kendo-ui kendo-grid kendo-asp.net-mvc

我在读取kendo网格数据方面遇到了问题。 控制器抛出一个异常"找不到原始类型的公共属性来排序。"

视图模型

public class PatientModel : IMapFrom<Patient>, IHaveCustomMappings
{
    public int? Id { get; set; }
    public PersonalDataModel PersonalDataModel { get; set; }
}

控制器

public ActionResult EditingPopup_Read([DataSourceRequest] DataSourceRequest request)
{
    var source = repository.All<PatientModel>();
    var patients = repository.All<PatientModel>().ToDataSourceResult(request);
    return Json(patients,JsonRequestBehavior.AllowGet);
 }

查看

@(Html.Kendo().Grid<DentalSoft.Data.Contracts.Patientes.PatientModel>()
.Name("PatientsGrid")    
.Columns(columns =>
{
    columns.Bound(p => p.PersonalDataModel.FirstName).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(false)));
    columns.Bound(p => p.PersonalDataModel.SecondName).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(false)));
    columns.Bound(p => p.PersonalDataModel.LastName).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(false)));
    columns.Bound(p => p.PersonalDataModel.TelephoneNumber).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(false)));
    columns.Bound(p => p.PersonalDataModel.HealthStatus).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(false))).Width(200);
    columns.Command(command => { command.Edit(); command.Destroy(); }).Width(250);
})
.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("PatientModel"))
.ToolBar(toolbar => toolbar.Create())
.Scrollable()
.Sortable()
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.HtmlAttributes(new { @class = "patients-grid" })
.DataSource(dataSource => dataSource
    .Ajax()
    .PageSize(20)
    .Model(model => model.Id(p => p.Id))
    .Create(create => create.Action("EditingPopup_Create", "Grid"))
    .Read(read => read.Action("EditingPopup_Read", "Grid"))
    .Update(update => update.Action("EditingPopup_Update", "Grid"))
        .Destroy(destroy => destroy.Action("EditingPopup_Destroy", "Grid"))
)
.Selectable()
)

ViewModel将拥有更多3,4个复杂对象。

2 个答案:

答案 0 :(得分:0)

正在搜索此问题,我找到了following article

  

创建一个只包含所需属性的新类   数据绑定网格(映射到网格列的属性)。 如果   绑定到EF确保添加密钥属性(此处为OrderID)   case)到ViewModel,即使你没有在网格中显示它。   否则你最终会得到NotSupportedException,说“不能   找到原始类型或属性,以“。

排序

看起来出现此问题是因为返回的repository.All<PatientModel>()缺少某些Entity Framework所需的属性(您使用的是Entity Framework吗?)。

您还可以尝试以下操作:

public ActionResult EditingPopup_Read([DataSourceRequest] DataSourceRequest request)
{
    var patients = repository.All<PatientModel>().ToList();
    return Json(patients.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
}

答案 1 :(得分:0)

将您的viewmodel更改为

$("body").on('click', 'a.home:visible', 'a.mobile:visible', 'a.phone:visible', function () {
        var attr = $(this).attr('attr');


        $(this).parents('.dropdown-menu').prev().prev().text(attr);
    });

public class PatientModel : IMapFrom<Patient>, IHaveCustomMappings
{
    public int Id { get; set; }
    public PersonalDataModel PersonalDataModel { get; set; }
}