Можно ли создать экземпляр объекта, когда столбцы создаются на kendo.grid? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть 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);

Как я могу получить доступ к полям комбинированного списка?

...