排序 GridView 上在 ASP.NET 4.5 使用模型绑定一个导航属性

发布时间: 2017/3/26 1:06:55
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

模型绑定有很多好处,可以节省大量的时间当你想要扔进 gridview 网页上的一些数据和得到它快速启动并运行。例如,我可以有这个员工类

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Job> Jobs { get; set; } 
    [NotMapped]
    public Job CurrentJob
    { 
        get { return Jobs.OrderByDescending(x => x.StartDate).FirstOrDefault(); }
    }

我把这扔进 gridview 模型绑定和模板字段用于计算属性︰

<asp:GridView runat="server" id="gvDataItemType" ItemType="Model.Employee" SelectMethod="Select" AllowSorting="True">
    <Columns>            
        <asp:DynamicField DataField="Name"/>
        <asp:DynamicField DataField="Email"/>    
        <asp:TemplateField HeaderText="Job" SortExpression="???">
            <ItemTemplate>
                <asp:Label ID="lblJobTitle" Text='<%# Bind("CurrentJob.JobName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        ...

用下列选择方法后面的代码中︰

public IQueryable<Employee> Select()
{
    MyContext context = new MyContext();
    return context.Employees;
}    

一切美妙排序很明显,CurrentJob.JobName 属性除外。

我的问题是︰如何对 GridView 上 CurrentJob.JobName 属性进行排序?

解决方法 1:

我想我可以回答我自己的问题。我到我不符合现有的排序表达式的模板字段添加独特的排序表达式︰

<asp:TemplateField HeaderText="Job" SortExpression="MeaninglessSortExpression">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblJobTitle" Text='<%# Bind("CurrentJob.Job.JobName") %>'></asp:Label>

然后我发现 gridview SelectMethod 将寻找这样的论点︰

Select(string sortByExpression)

然后我只是把一些条件逻辑右扔到我选择的方法。无需甚至处理 OnSorting 或任何像这样︰

public IQueryable<Employee> Select(string sortByExpression)
    {
        MyContext context = new MyContext ();
        if (sortByExpression == "MeaninglessSortExpression")
        {                
            return context.Employees.OrderBy(x => x.Jobs.OrderByDescending(y => y.StartDate).FirstOrDefault().Job.JobName);
        }

它是有点冗长,但我不能运行 LinqQuery 基于 => x.CurrentJob x,因为它是一个计算的属性。反正这工作。我甚至不需要手动调用 DataBind();唯一需要说明的是这显然将覆盖默认的排序功能,所以您可以重现它像这样︰

else
{
return context.employees.SortBy(sortByExpression); 

这也是很有帮助︰ ASP.Net 4.5 模型绑定排序由导航属性

官方微信
官方QQ群
31647020