ASP.Net 4.5 模型绑定按导航属性排序

2023-12-10

All,

我有一个包含以下列的网格视图。分页效果很好,但排序不行。每次我单击类别列按类别排序时,我都会收到此错误:

未为类型“ESA.Data.Models.Entity.Project”定义实例属性“Category.CategoryName”

此错误语句不正确,因为 gridview 能够正确显示该列。

这是选择方法

    public IQueryable<Project> getProjects()
    {
        ApplicationServices objServices = new ApplicationServices();
        IQueryable<Project> lstProject;
        lstProject = objServices.getProjects();
        return lstProject;
    }

有什么建议吗?

    <asp:GridView ID="grdProject" runat="server" ShowHeader="true" 
        AutoGenerateColumns="false" CellPadding="2" CellSpacing="2" 
        ItemType="ESA.Data.Models.Entity.Project"
        SelectMethod="getProjects"
        DataKeyNames="ProjectID" 
        AllowSorting="true"
        AllowPaging="true"
        PageSize="5">
        <Columns>
            <asp:BoundField DataField="ProjectID" HeaderText="ID " ItemStyle-Width="10" />
            <asp:BoundField DataField="Category.CategoryName" HeaderText="Category" SortExpression="Category.CategoryName" />
            <asp:BoundField DataField="ProjectName" HeaderText="Project Name" ItemStyle-Width="300"  />
            <asp:BoundField DataField="Status.StatusName" HeaderText="Status" SortExpression="Status.StatusName"  />
            <asp:BoundField DataField="AddedByUser.UserName" HeaderText="Added By" ItemStyle-Width="120"  />
            <asp:BoundField DataField="AddedDate" HeaderText="Added Date" ItemStyle-Width="90" DataFormatString="{0:d}"  />
        </Columns>
    </asp:GridView>

我在使用 Listview 控件时遇到了类似的问题。 我是这样解决的。

首先,我使用 Marc Gravell 这篇文章中的代码IEnumerable 上的动态 LINQ OrderBy

在我的列表视图的“OnSorting”事件中,我添加了以下代码。

protected void lv_Sorting(object sender, ListViewSortEventArgs e)
{
    e.Cancel = true;
    ViewState["OrderBy"] = e.SortExpression;
    lvList.DataBind();
}

我添加了一种相当标准的方法来捕获排序方向列表

public SortDirection sortDirection
{
    get
    {
        if (ViewState["sortdirection"] == null)
        {
            ViewState["sortdirection"] = SortDirection.Ascending;
            return SortDirection.Ascending;
        }
        else if ((SortDirection)ViewState["sortdirection"] == SortDirection.Ascending)
        {
            ViewState["sortdirection"] = SortDirection.Descending;
            return SortDirection.Descending;
        }
        else
        {
            ViewState["sortdirection"] = SortDirection.Ascending;
            return SortDirection.Ascending;
        }
    }
    set
    {
        ViewState["sortdirection"] = value;
    }
}

在我的列表视图中,Select 方法如下所示(使用 Marc 的扩展方法)

public IQueryable<SomeObject> GetObjects([ViewState("OrderBy")]String OrderBy = null)
{
    var list = GETSOMEOBJECTS();
    if (OrderBy != null)
    {
        switch (sortDirection)
        {
            case SortDirection.Ascending:
                list = list.OrderByDescending(OrderBy);
                break;
            case SortDirection.Descending:
                list = list.OrderBy(OrderBy);
                break;
            default:
                list = list.OrderByDescending(OrderBy);
                break;
        }
    }
    return list;
}

我还没有用 GridView 尝试过,但我相当确定它会起到同样的作用。

EDIT这是应该起作用的 linq 扩展类的示例

public static class LinqExtensions
{
    public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderBy");
    }
    public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "OrderByDescending");
    }
    public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenBy");
    }
    public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)
    {
        return ApplyOrder<T>(source, property, "ThenByDescending");
    }
    static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName)
    {
        string[] props = property.Split('.');
        Type type = typeof(T);
        ParameterExpression arg = Expression.Parameter(type, "x");
        Expression expr = arg;
        foreach (string prop in props)
        {
            // use reflection (not ComponentModel) to mirror LINQ
            PropertyInfo pi = type.GetProperty(prop);
            expr = Expression.Property(expr, pi);
            type = pi.PropertyType;
        }
        Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type);
        LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);

        object result = typeof(Queryable).GetMethods().Single(
                method => method.Name == methodName
                        && method.IsGenericMethodDefinition
                        && method.GetGenericArguments().Length == 2
                        && method.GetParameters().Length == 2)
                .MakeGenericMethod(typeof(T), type)
                .Invoke(null, new object[] { source, lambda });
        return (IOrderedQueryable<T>)result;
    } 
}

只需将 using 'whatevernamespaceyouused' 添加到页面即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.Net 4.5 模型绑定按导航属性排序 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 从loader跳转到ELF的入口点

    感谢您的帮助this问题是 加载器现在可以将静态编译的 hello world 映射到内存中并跳转到该内存区域中的某个位置 我现在面临的问题是我似乎没有跳转到正确的地址 或者我以错误的方式调用该函数 或错误的函数 下面是要尝试的代码 我在
  • DateRangePicker 与 Datatable - 合并两个搜索列

    在我插入 DaterangePicker 的漫长过程中数据表 我现在想使用两个日期范围选择器输入来组合两列搜索来过滤两个不同的列日期 但是 当您只想在一列中搜索时 它会起作用 但当您想搜索两列时 行为会不稳定 例如 如果您想搜索上个月的创建
  • Android 中的 AES 密钥生成

    目前我正在生成 AES 加密 解密的密钥 密钥基于密码和每个用户的随机盐 我的第一个想法是使用算法 PBKDF2WithHmacSHA1 制作一个 SecretKeyFactory 问题是Android目前不支持 进行一些搜索后 我发现埃里
  • 根据第二个数组中的值过滤对象数组

    我有一个对象数组 我想根据任何键的值是否与另一个数组中的任何值匹配来过滤它以创建一个新数组 const array1 name pink id 13 name orange id 17 name red id 64 name purple
  • 使用 ResourceDictionary 中的默认样式时,VS2008 XAML 设计器出现异常“Key不能为空”

    我使用共享的 ResourceDictionary 来定义默认样式 并且与 Visual Studio 2008 中的 XAML 设计器存在重大冲突 键不能为空对于所有显示 XAML 设计视图的尝试都会出现 该字典被合并到 App xaml
  • 哈希码总是相同的?

    我想知道HashCode是否总是相同的 例如 String myString my super string Int myHashCode myString GetHashCode Will myHashCode总是相同的值 在任何计算机上
  • 使具有多个文件名的“sed”的单个实例跳到下一个文件

    The next命令输入sed跳到下一行 但是对于多个文件 似乎没有任何命令可以跳到下一个文件 是否有任何解决方法仅使用single调用sed 问题演示 制作两个简单的 3 数数据文件 seq 3 gt three seq 10 1 13
  • 无法解析主机 github.com

    虽然我也有同样的问题question 但我面临着另一个问题 即 即使https github com 未在浏览器中运行并显示该网页不可用 这是在我安装 Heroku 后发生的 无法从终端访问 github 甚至无法从浏览器访问 诊断后我发现
  • 如何在Python中将字典项作为函数参数传递? [复制]

    这个问题在这里已经有答案了 My code 第一个文件 data school DAV standard 7 name abc city delhi my function data 第二个文件 my function data schoo
  • Shiny 仪表板内的 HTML 页面

    我的问题对于某些人来说很简单 但对于其他人 例如我 来说却很困难 I have a Shiny Dashboard in wich I want to add an html page inside a menuItem Se connec
  • 将 3 个列表合并为 1 个列表 [重复]

    这个问题在这里已经有答案了 我想将 3 个列表合并为一个列表 例如 我有三个列表 a 0 3 6 9 b 1 4 7 10 c 2 5 8 11 最后我想得到 merged 0 1 2 3 4 5 6 7 8 9 10 11 out of
  • 资源(.resx)文件有什么好处?

    使用它们有哪些令人信服的理由 资源文件根据用户的区域设置自动确定要使用的语言 resx 文件 为您提供了一种本地化 国际化 net 应用程序的简单方法 要添加更多语言 只需添加另一个翻译的资源文件即可 资源文件为您提供了一个存储字符串 文件
  • 删除 BottomNavigationView 标签

    谷歌发布了带有BottomNavigationView的新支持库v25 有什么办法可以去除物品标签吗 我希望我参加这里的聚会还不算太晚 但从设计支持库 28 0 0 alpha1 开始 您可以使用该房产 app labelVisibilit
  • ViewModel 在操作方法中获取空值

    我正在使用 ViewModel 来检索控制器操作中输入的数据 但 ViewModel 在其属性中获取空值 我正在创建一个局部视图 在那个局部视图中我正在创建下拉列表通过绑定 ViewModel 然后我渲染其他人的那部分观点View 下面是我
  • 使用 php 上传最大 100MB 的大文件

    我正在使用 PHP 制作一个文件托管网站 例如 Web 托管网站 megaupload rapidshare mediafire 等 或者告诉我它是否易于在 ASP NET 中实现 项目即将完成 但上传模块无法正常工作 我用谷歌搜索但找不到
  • 如何从 HTTP 处理程序中的 URL 获取参数

    我正在开发一个 Web 服务应用程序 其端点 加密货币 汇率接受两个货币 符号 作为输入 Web 服务应在数据库中搜索这些字符之间的货币兑换数据 如果数据库中没有值 或者时间戳值与当前值相差超过 1 分钟 则向服务 API 发出请求 htt
  • C# 中 async 总是异步吗? [复制]

    这个问题在这里已经有答案了 我正在做研发async and await对于我的项目 我学到的是 当async方法被调用时 它释放线程并让该线程被其他线程使用 我们可以使用可等待方法设置回调await关键字 并且该方法在结果准备好时返回值 如
  • Qt 对话框窗口的动态翻译

    我正在创建一个 Qt 应用程序 并添加了动态翻译 我按照以下示例进行操作 http www qtcentre org wiki index php title Dynamic translation in Qt4 applications
  • SQL Server:CROSS JOIN 和 FULL OUTER JOIN 之间有什么区别?

    SQL Server 中的 CROSS JOIN 和 FULL OUTER JOIN 有什么区别 它们是相同还是不同 请解释 什么时候会使用其中任何一个 A CROSS JOIN在两个表之间生成笛卡尔积 返回所有行的所有可能组合 它没有ON
  • ASP.Net 4.5 模型绑定按导航属性排序

    All 我有一个包含以下列的网格视图 分页效果很好 但排序不行 每次我单击类别列按类别排序时 我都会收到此错误 未为类型 ESA Data Models Entity Project 定义实例属性 Category CategoryName