EXT-NET:未捕获的TypeError:无法读取null

时间:2017-12-21 10:42:36

标签: javascript c# extjs grid ext.net

我正在尝试实现此示例: Dynamic_GridPanels

但是当我点击展开外部网格时,我收到此错误:

  

未捕获的TypeError:无法读取属性'type'的null

通过使用断点,我发现从DirectMethod返回后发生了错误。我没有发布外部网格(misArtStore)的代码,因为它正常工作。

这是我的代码:

标记

<ext:GridPanel
                                    runat="server"
                                    Title="Expander Rows with GridPanel"
                                    Collapsible="true"
                                    AnimCollapse="true"
                                    Icon="Table"
                                    Width="600"
                                    Height="450"
                                    DisableSelection="true">
                                    <Store>
                                        <ext:Store ID="misArtStore" runat="server">
                                            <Model>
                                                <ext:Model runat="server" IDProperty="Id">
                                                    <Fields>
                                                        <ext:ModelField Name="Id" />
                                                        <ext:ModelField Name="missing" />
                                                    </Fields>
                                                </ext:Model>
                                            </Model>
                                        </ext:Store>
                                    </Store>
                                    <ColumnModel runat="server">
                                        <Columns>
                                            <ext:Column runat="server" Text="Artifacts" DataIndex="missing" Flex="1" Hideable="false" />
                                        </Columns>
                                    </ColumnModel>
                                    <Plugins>
                                        <ext:RowExpander runat="server">
                                            <Loader runat="server" DirectMethod="#{DirectMethods}.GetGrid" Mode="Component">
                                                <LoadMask ShowMask="true" />
                                                <Params>
                                                    <ext:Parameter Name="id" Value="this.record.getId()" Mode="Raw" />
                                                </Params>
                                            </Loader>
                                        </ext:RowExpander>
                                    </Plugins>
                                </ext:GridPanel>

代码背后

[DirectMethod]
        public string GetGrid(Dictionary<string, string> parameters)
        {
            string id = parameters["id"];
            DALP.PDBDataContext dc = new DALP.PDBDataContext();
            DAL.AdminDataContext ds = new DAL.AdminDataContext();

            string uname = HttpContext.Current.User.Identity.Name;

            var clientid = (from u in ds.ClientUsers            
                            where u.UserName == uname
                            select u.ClientId);

            var sites = (from mc in dc.TMFCategories //sites is populated correctly
                        join mat in dc.TMFTemplateCts on mc.Id equals mat.Catid
                        join st in dc.Sites on mat.ctid equals st.CTid
                        where ( (!dc.TMFFiles.Any(x=>x.SiteId==st.Siteid)) && mat.Required == true && mat.Clientid == int.Parse(clientid.First().ToString()) && mat.ctid == ctid && mc.Id == Convert.ToInt32(id)) 
                        select new { Siteid = st.Siteid, Site = st.FullName });


            GridPanel grid = new GridPanel
            {
                Height = 200,
                EnableColumnHide = false,
                Store =
            {
                new Store
                {
                    Model = {
                        new Model {
                            IDProperty = "Siteid",
                            Fields =
                            {
                                new ModelField("Siteid"),
                                new ModelField("Site")
                            }
                        }
                    },
                    DataSource = sites
                }
            },
                ColumnModel =
                {
                    Columns =
                {
                    new Column { Text = "Site", DataIndex = "Site", Width = 150 }
                }
                }
            };

            return ComponentLoader.ToConfig(grid);
        }

Chrome控制台:

  

未捕获的TypeError:无法读取属性'type'的null

at F.setLayout (ext.axd:19)
at F.getLayout (ext.axd:19)
at F.add (ext.axd:19)
at g.Ext.ComponentLoader.Renderer.Component (ext.axd:445)
at g.onComplete (ext.axd:495)
at Object.complete (ext.axd:463)
at Object.userSuccess (ext.axd:268)
at F.executeScriptDelay (ext.axd:256)
at F.executeScript (ext.axd:255)
at F.requestSuccessHandler (ext.axd:248)

修改 enter image description here

(使用@Przemek提供的解决方案解决图像错误)

1 个答案:

答案 0 :(得分:2)

这是linq查询的问题,而不是Grid。尝试使用:

DataSource = sites.ToList()

或创建自己的自定义对象列表:

public class CustomObject
{
    public string Siteid {get; set; }
    public string Site {get; set; }
}

(...)

select new CustomObject() { Siteid = st.Siteid, Site = st.FullName });

修改

没有数据库连接的工作示例:

* ASPX:

<ext:GridPanel runat="server" Title="Expander Rows with GridPanel"
    Collapsible="true" AnimCollapse="true" Icon="Table"
    Width="600" Height="450" DisableSelection="true">
    <Store>
        <ext:Store ID="misArtStore" runat="server">
            <Model>
                <ext:Model runat="server" IDProperty="Id">
                    <Fields>
                        <ext:ModelField Name="Id" />
                        <ext:ModelField Name="missing" />
                    </Fields>
                </ext:Model>
            </Model>
        </ext:Store>
    </Store>
    <ColumnModel runat="server">
        <Columns>
            <ext:Column runat="server" Text="Artifacts" DataIndex="missing" 
                Flex="1" Hideable="false" />
        </Columns>
    </ColumnModel>
    <Plugins>
        <ext:RowExpander runat="server">
            <Loader runat="server" DirectMethod="#{DirectMethods}.GetGrid" Mode="Component">
                <LoadMask ShowMask="true" />
                <Params>
                    <ext:Parameter Name="id" Value="this.record.getId()" Mode="Raw" />
                </Params>
            </Loader>
        </ext:RowExpander>
    </Plugins>
</ext:GridPanel>

* aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack || X.IsAjaxRequest)
        return;

    misArtStore.DataSource = new object[] 
    { 
        new { Id = "1", missing = "missing 1" },
        new { Id = "2", missing = "missing 2" },
        new { Id = "3", missing = "missing 3" }
    };

    misArtStore.DataBind();
}

[DirectMethod]
public string GetGrid(Dictionary<string, string> parameters)
{
    GridPanel grid = new GridPanel
    {
        Height = 200,
        EnableColumnHide = false,
        Store =
        {
            new Store
            {
                Model = 
                {
                    new Model 
                    {
                        IDProperty = "Siteid",
                        Fields = { new ModelField("Siteid"), new ModelField("Site") }
                    }
                },
                DataSource = new object[] 
                { 
                    new { Siteid = "1", Site = "Site 1" },
                    new { Siteid = "2", Site = "Site 2" }
                }
            }
        },
        ColumnModel =
        {
            Columns = { new Column { Text = "Site", DataIndex = "Site", Width = 150 } }
        }
    };

    return ComponentLoader.ToConfig(grid);
}