在kendo.grid上创建列时,可以实例化对象吗?

时间:2019-05-21 22:46:16

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

我有一个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);

如何访问组合框的字段?

0 个答案:

没有答案