LinqDataSource 与 ASP.NET 数据控件 [第三部分]
将 LinqDataSource 与 GridView 和 DropDownList 等 ASP.NET 数据控件结合使用
涵盖的主题
简介、LINQ to SQL 类文件、LINQ DataSource 和 .dbml 文件结构 |
DataContext 类,在 C# 3.0 中编写 LINQ 以及参数化 LINQ 查询 |
使用 LinqDataSource 动态更改底层 T-SQL 以及 CRUD 操作的一部分(更新和删除) |
使用 LinqDataSource.Insert() 进行插入,并通过 web.config 管理数据库连接 |
LinqDataSource 第一部分 |
LinqDataSource 第二部分 |
LinqDataSource 第三部分 |
LinqDataSource 第四部分 |
将 LinqDataSource 与 ASP.NET 数据控件结合使用

有几个查询指向同一个问题——如何在下拉列表中添加“所有”选项?我们需要它来选择所有客户。如上所示,我们可以通过使用 DropDownList
的 Items
属性来实现。DropDownList 是 ListItem 的集合,并接受键值对作为输入。FillList()
方法将为我们完成这项工作。
我们将从 第二部分 的结尾继续(第一部分 可在此处获取)。第三部分的任务大约需要 25 分钟完成。在这里,我们将介绍如何使用 LinqDataSource
动态更改底层 T-SQL 以及 CRUD 操作的一部分(除了插入,插入和 web.config 的细节将在第四部分介绍)。在 第二部分 中,我们使用下拉列表作为过滤器。如果我们想查看所有记录怎么办?(例如,学生、公司以及普通客户——所有客户)。这在 Web 应用程序中非常常见,如图 1 所示。

现在让我们看看将产生此输出的代码。您注意到一个技巧了吗——此输出与“select * from customer
”一样好——正确!没有 where
子句或过滤器。因此,我们需要根据某个条件从 LINQ 中移除 where
条件。在这种情况下,条件将是 if (DropDownList1.SelectedValue == "All")
。
价值百万美元的问题是,这段代码应该写在哪里?逻辑答案是,就在 select
查询命中数据库之前。图 2 将引导您完成此过程。

LinqDataSource
的 Selecting 事件将在 select
操作执行之前触发。因此,我们在 select
操作执行之前移除了 where
条件。这个技巧对于动态构建 LINQ 查询非常有用。这个事件以及插入/删除等其他事件可以在许多场景中使用。我们将把这些事件留作练习。
让我们启用 GridView 的分页和排序。如图 3 所示,右键单击 GridView
,然后从智能标签中选择分页和排序复选框。

PageSize 属性将决定您希望 GridView 的每页显示多少条记录。启用分页和排序很简单。不简单的是底层 T-SQL。事实上,LINQ 生成的 T-SQL 与任何其他分页逻辑一样好。如果您有 11 条记录,并将 GridView
的 PageSize 设置为每页少于 11 条记录,那么 LINQ 将生成真正的分页逻辑,如图 4 所示。它显示了 3 个不同的 T-SQL 片段。SQL Server 查询分析器用于捕获这些查询。

数字 1 代表 LINQ 生成的 T-SQL。数字 2 与我在存储过程中编写的分页逻辑几乎相同,数字 3 是 SqlDataSource
生成的 T-SQL。因此,LINQ 的核心在于其生成 动态执行策略 的能力。
我们经常看到一项新技术与其同时代的技术进行比较。LinqDataSource
与 SqlDataSource
和 ObjectDataSource
有何不同?Dino 在这个 博客文章 中对这个比较进行了精彩的论述。我不认为 LINQ 会是与数据库驱动的 Web 应用程序相关问题的万能药。LINQ 是这个领域的新手,应该认真对待它——仅此而已。接下来,我们将为 GridView
启用行内更新。右键单击 LinqDataSource
,然后从智能标签中单击“Enable update”复选框,如图 5 所示。

接下来,右键单击 GridView
,并在其智能标签中选择 checkbox
——“Enable editing”。就这样——我们完成了更新操作。请参考图 6 获取详细信息。

一个小陷阱是,先在 LinqDataSource
上启用更新,然后才能在 GridView
上找到“Enable editing”选项。解决此问题的变通方法是在 *.aspx 页面上设置属性。最终结果如图 7 所示。

只需几次点击,我们就获得了完整的更新功能。现在我们将进行删除操作。从 LinqDataSource
的智能标签中选择“Enable Delete”,参见图 5。如图 6 所示,在 GridView
上启用“Enable deleting”选项。这样——我们就完成了删除操作。由于删除是破坏性的操作,因此应格外谨慎。因此,我们将添加一个 JavaScript 来提示用户进行确认,如图 13 所示。
要添加此确认功能,请右键单击 GridView
,并从智能标签选项中选择“Edit columns”(编辑列),如图 8 所示。在随后的字段提示屏幕上,从选定字段列表中选择 CommonField
,然后单击“Convert this field to a template field”(将此字段转换为模板字段)链接。单击“OK”按钮以完成此操作。

再次右键单击 GridView
,并从智能标签中单击“Edit Template”(编辑模板),如图 9 所示。

在结果屏幕上,您将找到三个命令按钮/链接按钮,具体取决于您之前的选择。现在右键单击“Delete”(删除)按钮,然后选择“properties”(属性),如图 10 所示。

您需要在 OnClientClick
属性中输入此内容:“return confirm('Are you sure you want to delete?');
” 另一种选择是直接在您的 *.aspx 文件中编写代码,如图 11 所示。

无论您如何编码(通过点击或在 *.aspx 文件中),最终结果都应与图 12 所示相同。

现在,如果您单击“Delete”(删除)按钮,将显示一个确认框,如图 13 所示。只有当您单击“Yes”(是)按钮时,记录才会被从数据库中删除。这种双重检查可以防止意外删除记录。


在本部分中,我们介绍了如何在 LINQ 命中 SQL Server 之前进行拦截,以及如何使用 LinqDataSource
启用更新和删除。在第四部分,我们将重点介绍使用 LinqDataSource
插入记录以及 LINQ 对 web.config 的影响。我们将在第四部分介绍 LINQ 如何管理数据库连接。(第一部分 和 第二部分 可在此处获取,供您参考)。
祝您编程愉快!
注意:请为您投票并提供您对这个系列的反馈,以便未来的工作可以改进/与您的期望保持一致。
谢谢!