asp.net 抓取网页数据(WebFormsModelBinding(比如SqlDataSource,EntityDataSource,LinqDataSource),能让你直接从服务器端控件连接数据源。)
优采云 发布时间: 2022-04-02 19:16asp.net 抓取网页数据(WebFormsModelBinding(比如SqlDataSource,EntityDataSource,LinqDataSource),能让你直接从服务器端控件连接数据源。)
Web 窗体模型绑定第 1 部分:数据选择(ASP.NET vNext 系列)
【原帖地址】Web Forms模型绑定第1部分:选择数据(ASP.NET vNext系列)
【原文发表时间】2011-09-05 21:58
这是我撰写的 ASP.NET vNext 系列博客文章中的第三篇文章。
.NET 和 Visual Studio 的下一个版本包括许多很棒的新功能。借助 ASP.NET vNext,您将看到对 Web 窗体和 MVC 的许多令人兴奋的改进——以及对构建它们的底层 ASP.NET Core 库的改进。
这是我将在接下来的两周内撰写的关于 Web 表单对新模型绑定的支持的 3 篇博文中的第一篇。模型绑定是对现有 ASP.NET Web Forms 数据绑定系统的扩展,提供了基于代码的数据访问范式。它利用了我们首先介绍的 ASP.NET MVC 模型绑定概念,并通过 Web 窗体服务器控制模型将它们很好地结合在一起。
当今数据绑定的背景
Web 窗体包括一组数据源控件(例如 SqlDataSource、EntityDataSource、LinqDataSource),它们允许您直接从服务器端控件连接到数据源。许多开发人员更喜欢完全控制他们的数据访问逻辑——并在代码中编写该逻辑。
在以前版本的 Web 窗体中,这可以通过直接设置控件的 DataSource 属性,然后在页面的代码隐藏中调用 DataBind() 函数来完成。这种方法虽然适用于很多场景,但是对于数据量很大的控件(如GridView),这种方法并不能很好地支持排序、分页、编辑等自动化操作。
还有一种可行的方法是使用ObjectDataSource 控件。此控件允许更清晰地分离 UI 代码和数据访问层,允许数据控件提供自动功能,例如分页和排序。不过虽然在选择数据的部分很有用,但是进行双向数据绑定还是很麻烦,只支持简单的属性(没有高级的复杂类型绑定),而且经常需要开发者写很多复杂的代码处理许多场景(包括常见的场景,如验证错误)。
模型绑定简介
ASP.NET vNext 为 Web 窗体中的“模型绑定”提供了很多新的支持。
模型绑定旨在简化基于代码的数据访问逻辑,同时保持丰富的双向数据绑定框架的优势。它继承了我们首先介绍的 ASP.NET MVC 模型绑定样式,并结合了 Web 窗体服务器控件模型。这使得使用 Web 窗体执行常见的 CRUD 样式方案变得容易,同时还允许您使用任何数据访问技术(EF、Linq、NHibernate、DataSets、原创 ADO.NET 等)
本周我将写一些其他博客文章,介绍如何利用新的模型绑定功能。在今天的博文中,我将展示如何使用模型绑定来检索数据 - 并在 GridView 控件中实现排序和分页。
使用 SelectMethod 检索数据
模型绑定是一种以代码为中心的数据绑定方法。
它允许您在页面的代码隐藏文件中编写 CRUD 辅助函数,并轻松连接到页面中的任何服务器控件。然后服务器控件会在页面生命周期中调用上述函数,并在适当的时候进行数据绑定。
让我们看一个使用控件的简单示例。下面的 GridView 有 4 列 - 其中 3 列是标准 BoundFields,第 4 列是 TemplateField。注意我们如何将 GridView 上的 ModelType 属性设置为 Category 对象——这允许我们在模板字段中实现强类型数据绑定(例如 Item.Products.Count 而不是使用 Eval() 函数):
我们将 GridView 配置为使用模型绑定来检索数据,方法是将 GridView 的 SelectMethod 属性设置为指向页面代码隐藏文件中的 GetCategories() 函数。GetCategories() 函数如下所示:
public IQueryable GetCategories() {
var northwind = new Northwind();
return northwind.Categories.Include(c => c.Products);
}
在上面的示例中,我使用 EF Code First 执行 LINQ 查询以从 Northwind 示例数据库返回类别列表。请注意,我们不需要在代码隐藏中执行数据库查询——我可以通过存储库或数据访问层来完成,或者使用 GetCategories() 方法来连接控件。
当我们运行页面的时候,GridView会自动调用上面的函数,然后取回数据并显示在页面上,如下:
避免 N+1 选择
查看上面的代码,您可能会注意到我们在 LINQ 查询中使用了 .Include(c=>c.Products) 辅助扩展。这告诉 EF 修改查询,以便除了检索类别信息之外,它还包括关联的产品(避免为返回的每一行信息单独调用数据库)。
排序和分页支持
我们可以在 GetCategories() 函数中使用 IEnumerable - 或实现类似 List 的接口类型来返回类别。虽然我们使用 IQueryable 接口返回类别:
返回的 IQueryable 的好处是它延迟了查询的执行,并允许数据绑定控件在执行前修改查询。这对于支持分页和排序的控件很有用。这些控件可以在执行前对 IQueryable 查询自动添加排序和分页操作。这使得在代码上实现排序和分页变得容易 - 并确保在数据库上完成排序和分页,并且非常高效。
使用GridView实现排序和分页,我们需要将它的AllowSorting和AllowPaging属性改为True,然后将默认的PageSize设置为5。同时我们也在两列中指定了合适的SortExpression。
现在我们运行页面,我们可以对数据进行分页和排序:
只会从数据库中检索类别并显示在当前排序页面上 - 因为 EF 将优化查询并执行排序和页面操作作为数据库查询的一部分,而不在中间层进行排序/分页。因此,即使有大量数据,排序/分页也会很有效。
关于模型绑定和 SelectMethod 的简短视频
Damiana Edwards 制作了一段 90 秒的精彩视频,展示了使用模型绑定来实现带有排序和分页的 GridView 场景。您可以单击此处观看 90 秒的视频。
总结
ASP.NET vNext 对新模型绑定的支持是对现有 Web 窗体数据绑定系统的完美演变。它继承了 ASP.NET MVC(您将在后面的许多 文章 中看到)模型绑定系统的思想和功能,使基于代码的数据访问范式更简单、更灵活。
在本系列的未来博客文章中,我将扩展模型绑定,看看我们如何轻松地将过滤器场景合并到我们的数据选择场景中,以及如何处理编辑场景(包括那些使用验证的场景)。
希望这些对你有帮助。
斯科特