У меня есть kendo.grid со следующим определением столбца:
co.Bound(c => c.ReportProperty.PropertyName)
Существует модель, в которой определен объект:
public ReportPropertyEntity ReportProperty { get; set; }
Этот объект обладает свойством PropertyName
.
Я хочу, чтобы его значение отображалось в сетке.
Когда я это делаю, я получаю javascript
ошибку, говорящую:
Невозможно получить свойство 'PropertyName' с неопределенной или нулевой ссылкой
Я считаю, что ReportProperty
объект должен быть создан перед использованием его свойства.
У меня есть kendo.grid со следующим определением столбца:
co.Bound(c => c.ReportProperty.PropertyName)
Существует модель, в которой определен объект:
public ReportPropertyEntity ReportProperty { get; set; }
Этот объект обладает свойством PropertyName
.
Я хочу, чтобы его значение отображалось в сетке.
Когда я это делаю, я получаю javascript
ошибку, говорящую:
Невозможно получить свойство 'PropertyName' с неопределенной или нулевой ссылкой
Я считаю, что ReportProperty
объект должен быть создан перед использованием его свойства.
Свойства этих классов отображаются из запроса к базе данных и определяются в Entity Project:
public class TicketReportPropertyEntity
{
ReportPropertyEntity ReportProperty { get; set; }
public int ID { get; set; }
public int TicketID { get; set; }
public decimal Amount { get; set; }
}
public class ReportPropertyEntity
{
public int ReportPropertyID { get; set;}
public string ReportGroup { get; set; }
public string PropertyName { get; set; }
public int ReportID { get; set; }
}
Как видно из этого кода, класс ReportPropertyEntity
является частью TicketReportPropertyEntity
.
Это запрос, который возвращает XML-код результата, из которого эти классы сериализуются с использованием следующей логики:
var xml = new TicketReportProperty().RunProcedureXmlString("SPU_Get_TicketReportProperty", parameters);
List<TicketReportPropertyEntity> res = SerializeObject<List<TicketReportPropertyEntity>>.FromXml(xml);
return res;
Это запрос, который генерирует XML-файл из таблиц:
SELECT
(
SELECT
(
SELECT trp.ID, TicketID, ReportID AS "ReportProperty/ReportID", ReportPropertyID AS "ReportProperty/ReportPropertyID",
PropertyName AS "ReportProperty/PropertyName", PropertyName, Section AS "ReportProperty/ReportGroup", Amount
FROM TicketReportProperty trp
INNER JOIN ReportProperty rp ON rp.ID = trp.ReportPropertyID
WHERE TicketID = 6893
FOR XML PATH('TicketReportPropertyEntity'), TYPE
)
) FOR XML PATH('ArrayOfTicketReportPropertyEntity'), TYPE
Сериализованный класс возвращается в модель, и его поля привязываются к полям модели:
Это модель:
public class TicketReportPropertyModel
{
public List<TicketReportPropertyEntity> TicketReportPropertyList { get; set; }
ReportPropertyEntity ReportProperty { get; set; }
public int ID { get; set; }
public int TicketID { get; set; }
public int ReportID { get; set; }
public decimal Amount { get; set; }
public TicketReportPropertyModel GetTicketReportPropertyData(int ticketId)
{
var client = new IeBalanceServiceClient();
var report = client.GetTicketReportPropertyData(ticketId).ToList();
client.Close();
TicketReportPropertyModel model = MapFromBusinessObject(report);
return model;
}
public TicketReportPropertyModel MapFromBusinessObject(List<TicketReportPropertyEntity> res)
{
TicketReportPropertyModel m = new TicketReportPropertyModel();
m.TicketReportPropertyList = res ?? new
List<TicketReportPropertyEntity>();
return m;
}
public List<ReportPropertyEntity> GetReportPropertyData(int reportId)
{
List<ReportPropertyEntity> reportProp = TicketReportPropertyRepository.GetReportPropertyEntityRepository(reportId);
return reportProp;
}
}
И, как я уже говорил, в моей сетке есть поле, содержащее Kendo().ComboBox()
, сгенерированное из шаблона:
columns.Bound(c => c.ReportProperty.PropertyName).Title("Property Name").EditorTemplateName("_PropertyNameEditor").Width(900);
ReportProperty
сущность является частью TicketReportPropertyEntity
.
И это Grid
само по себе связано с TicketReportPropertyEntity
:
@(Html.Kendo().Grid<TicketReportPropertyEntity>()
.Name("TicketReportPropertyGrid")
.Columns(columns =>
{
columns.Bound(c => c.ID).Hidden();
columns.Bound(c => c.ReportProperty.PropertyName).Title("Property Name").EditorTemplateName("_PropertyNameEditor").Width(900);
columns.Bound(c => c.Amount).Title("Amount").Format("{0:C}").Width(90);
columns.Command(command =>
{
command.Destroy();
}).Width(250);
})
.ToolBar(toolbar =>
{
toolbar.Create();
toolbar.Save();
})
.Editable(editable => editable.Mode(GridEditMode.InCell).ConfirmDelete("Are you sure").DisplayDeleteConfirmation("Delete"))
.Events(events => events.DataBound("Databound").SaveChanges("SaveGrid").Edit("Edit"))
.DataSource(datasource => datasource
.Ajax()
.Batch(true)
//.PageSize(20)
.Model(model =>
{
model.Id(c => c.ID);
model.Field(c => c.PropertyName);
model.Field(c => c.Amount);
})
.Events(events => events.Error("error_handler"))
.Read(read => read.Action("GetData", "TicketReportProperty", Model))
.Update(update => update.Action("UpdateTicketReportProperty", "TicketReportProperty")))
)
Вот как я определяю Kendo().ComboBox()
внутри шаблона редактора:
@(Html.Kendo().ComboBox()
.Name("ReportProperty")
.DataTextField("PropertyName")
.DataValueField("ReportPropertyID")
.HtmlAttributes(new { id = "ReportPropertyCB" })
.Template("<span class=\"k-state-default\"><h3>#: PropertyName #</h3><p>#: ReportGroup #</p></span>")
)
Это строка, где я получаю сообщение об ошибке:
Невозможно получить свойство 'PropertyName' с неопределенной или нулевой ссылкой
c.ReportProperty.PropertyName).Title("Property Name").EditorTemplateName("_PropertyNameEditor").Width(900);
Как я могу получить доступ к полям комбинированного списка?