GridView 动态字段子属性生成"表没有列"错误



我在GridView中有一个动态字段的问题。我试图从相关实体获得一个属性字段,比如"客户"。但总是得到错误"表'Order'没有名为'Customer.Name'的列"。"

我在linq查询中包含了Customer实体。

如果我把DynamicField改成BoundField,一切正常

编辑:这是代码…

<asp:GridView ID="grvActivities" runat="server"
                Caption="<%$ Resources:QuasarApp, MyOpenActivities %>" AutoGenerateColumns="false"
                DataKeyNames="ActivityId" ItemType="Quasar.Model.Activity"
                ShowHeaderWhenEmpty="True" AllowSorting="True"
                ShowFooter="True" CssClass="table table-striped table-bordered table-hover table-condensed table-responsive"
                SelectMethod="grvActivities_GetData"
                UpdateMethod="grvActivities_UpdateItem"
                OnRowCommand="grvActivities_RowCommand">
                <Columns>
                    <asp:HyperLinkField ControlStyle-CssClass="nounderline fa fa-edit"
                        DataNavigateUrlFields="ActivityId" DataNavigateUrlFormatString="~/Activities/Edit.aspx?RecordId={0}"
                        ItemStyle-Width="25px" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle" />
                    <asp:TemplateField ShowHeader="false">
                        <ItemTemplate>
                            <asp:LinkButton ID="Complete" runat="server" CommandName="Complete" CommandArgument='<%# Eval("ActivityId") %>'
                                CssClass="nounderline fa fa-check-square-o" ToolTip="<%$ Resources:QuasarApp, MarkAsCompleted %>" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:DynamicField DataField="StartDate" DataFormatString="{0:g}" />
                    <asp:DynamicField DataField="DueDate" DataFormatString="{0:g}" />
                    <asp:DynamicField DataField="EndDate" DataFormatString="{0:g}" />
                    <asp:DynamicField DataField="Name" />
                    <asp:DynamicField DataField="Activity.Customer.Name" />
                    <asp:DynamicField DataField="Lead" />
                    <asp:DynamicField DataField="PriorityLevel" />
                    <asp:DynamicField DataField="ActivityType" />
                    <asp:DynamicField DataField="Status" />
                    <asp:DynamicField DataField="CreatedBy" />
                    <asp:ButtonField ButtonType="Link" CommandName="Delete" ControlStyle-CssClass="nounderline fa fa-eraser"
                        ItemStyle-Width="25px" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle" />
                </Columns>
            </asp:GridView>
后台代码:

public IQueryable<Activity> grvActivities_GetData()
    {
        var query = _uow.Activities.GetMany(a =>
            a.IsActive
            && a.AccountManagerId == currentAccountManager
            && a.EndDate == null,
            q => q.OrderByDescending(s => s.StartDate),
            includeProperties: "Customer, Lead, ActivityType");
        return query;
    }

Edit2:嗨,我发现这个专栏:

<asp:TemplateField HeaderText="<%$ Resources:QuasarApp, Customer %>">
                        <ItemTemplate>
                            <asp:Label Text="<%# Item.Customer != null ? Item.Customer.Name : String.Empty %>" runat="server" />
                        </ItemTemplate>
                    </asp:TemplateField>

它工作得很好,但我失去了所有排序等功能。为什么当导航属性出现在数据源中时,DynamicField找不到这个属性?

对于导航属性,您应该只使用这个:

<asp:DynamicField DataField="Customer" />

动态数据将显示类的第一个字符串属性。或者你可以强制使用注释:

[DisplayColumn("Name")]
public class Customer

但是如果你使用的是EF6,就必须安装提供程序[http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing - -释放- -动态数据提供者-和- entitydatasource -控制- - - - - - -实体框架- 6. - aspx] [1]

并在global.asax.cs:

中注册你的模型
void Application_Start(object sender, EventArgs e)
    {            
        MetaModel DefaultModel = new MetaModel();
        DefaultModel.RegisterContext(new  Microsoft.AspNet.DynamicData.ModelProviders.EFDataModelProvider(
                                     () => new YOURCONTEXT()),
                                     new ContextConfiguration { ScaffoldAllTables = false });
    }
最后设置page_init代码:
protected void Page_Init()
{
    grvActivities.SetMetaTable(MetaTable.GetTable(typeof(Activity)));
}

相关内容

  • 没有找到相关文章

最新更新