2015-04-26 4 views
0

У меня проблема с чтением данных для сетки кендо. Контроллер выдает исключение «Не удается найти общедоступное свойство примитивного типа для сортировки».Сортировка сетки Kendo со сложными объектами

ViewModel

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 сложных объекта.

ответ

0

Поиск по этому вопросу я нашел following article:

Создайте новый класс, который будет содержать только свойства, необходимые для Databinding сетки (свойства, отображенные сетки колонн, что есть). Если привязка к EF привязана к , убедитесь, что вы добавили свойство ключа (OrderID в этом случае ) в ViewModel, даже если вы не отобразите его в сетке. В противном случае вы получите NotSupportedException, в котором говорится: «Can найти примитивный тип или свойство сортировать по».

Похоже, эта проблема возникает, потому что все, что 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); 
} 
0

Изменение ViewModel к

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

или

public class PatientModel : IMapFrom<Patient>, IHaveCustomMappings 
{ 
    public string Id { get; set; } 
    public PersonalDataModel PersonalDataModel { get; set; } 
} 
Смежные вопросы