关于ASP.NET vNext的一些视频资料:http://www.asp.net/vnext

[原文发表地址] Web  Forms Model Binding Part 1: Selecting Data (ASP.NET vNext  Series)

下一版的.NET和Visual Studio包括了许多很棒的新功能。有了ASP.NET  vNext,你会看到许多令人激动的Web窗体和MVC改进——还有它们建立的基础ASP.NET核心库的改进。

这两个礼拜我会写3篇博文来讲讲Web窗体对新模型绑定的支持,这是第一篇。模型绑定是ASP.NET  Web窗体现有数据绑定系统的扩展,提供了代码为主的数据访问范例。它利用了我们最早介绍的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辅助函数,并很方便与页面中的任意服务器控件相连。然后服务器控件就会在适当的时候,在页面生命周期内调用上述函数,并进行数据绑定。

来看一个简单的例子,我们使用<asp:gridview>控件。下面的GridView有4个栏——其中3个是标准的BoundField,第4个是TemplateField。注意我们是如何在GridView上设置ModelType属性到Category对象上的——这个能让我们在templatefield中实现强类型数据绑定(比如Item.Products.Count而不是使用Eval() 函数):

<asp:GridView ID="categoriesGrid" runat="server" ModelType="WebApplication1.Model.Category"
 SelectMethod="GetCategories" AutoGenerateColumns="false">
 <Columns>
 <asp:BoundField DataField="CategoryID" HeaderText="ID" />
 <asp:BoundField DataField="CategoryName" HeaderText="Name" />
 <asp:BoundField DataField="Description" HeaderText="Description" />
 <asp:TemplateField HeaderText="# of Products">
 <ItemTemplate><%# Item.Products.Count %></ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

我们对GridView进行了配置,在页面的后台代码文件中将GridView的SelectMethod属性设置为指向GetCategories()函数,从而实现使用模型绑定来检索数据。这个GetCategories()函数如下所示:

public IQueryable<Category> GetCategories() { 
 
 var northwind = new Northwind();
 return northwind.Categories.Include(c => c.Products);
}

上 面的例子中,我用EF Code  First来执行LINQ查询,从Northwind示例数据库中返回category清单。注意我们无需在后台代码中执行数据库查询——我可以通过一个 仓储或数据访问层来执行,或者使用GetCategories()方法来连接控件。

当我们运行页面,GridView就会自动调用上述函数,然后检索数据,并在页面上做如下显示:

避免N+1选择

看 了上面的代码,你可能会注意到我们在LINQ查询中使用的是.Include(c=>c.Products)辅助扩展。这就能告诉EF要修改查询, 这样除了检索Category信息之外,还包括了相关联的Products(避免为返回的每行信息,而分开调用数据库)。

排序和分页支持

我 们可以在GetCategories() 函数中使用IEnumerable<Category> ——或者实现像List<Category>这样的接口类型来返回categories。尽管我们用的是 IQueryable<Category>接口来返回category:

public IQueryable<Category> GetCategories() { 
 
 var northwind = new Northwind();
 return northwind.Categories.Include(c => c.Products);
}

返 回的IQueryable<T>的好处就是它能在延迟执行查询,还能在执行前允许数据绑定控件对查询进行修改。这对那些支持分页和排序的控件 来说是很有用的。这些控件可以在执行前自动在IQueryable<T>查询上添加排序和分页操作。这样使得在代码上实现排序和分页变得简单 了——并且确保了排序和分页在数据库上完成,和超级高效。

要用GridView实现排序和分页,我们要修改它的AllowSorting和AllowPaging属性变为True,然后将默认PageSize为5。同时我们还在两个栏中,指定合适的SortExpression

<asp:GridView ID="categoriesGrid" runat="server" AutoGenerateColumns="false"
 AllowSorting="true" AllowPaging="true" PageSize="5"
 ModelType="WebApplication1.Model.Category" 
 SelectMethod="GetCategories">
 <Columns>
 <asp:BoundField DataField="CategoryID" HeaderText="ID" SortExpression="CategoryID" />
 <asp:BoundField DataField="CategoryName" HeaderText="Name" SortExpression="CategoryName" />
 <asp:BoundField DataField="Description" HeaderText="Description" />
 <asp:TemplateField HeaderText="# of Products">
 <ItemTemplate><%# Item.Products.Count %></ItemTemplate>
 </asp:TemplateField>
 </Columns>
</asp:GridView>

现在我们运行页面,我们就能分页和排序数据了:

将只从数据库中检索出category并显示在当前排序页——因为EF会优化查询,将排序和页面操作看做数据库查询的一部分来执行,不会在中间层进行排序/分页。所以即使有大量的数据,排序/分页也会很高效。

模型绑定和SelectMethod的简短视频

Damiana Edwards做了一个很棒的90秒视频,展示了使用模型绑定来实现具有排序和分页功能的GridView场景。你可以点击这里观看90秒视频。

总结

ASP.NET vNext支持新的模型绑定是现有Web窗体数据绑定系统的完美演变。它承袭了ASP.NET  MVC(你会在之后的很多文章中看到它)模型绑定系统的理念和功能,使得代码为主的数据访问范例更简单灵活。

在之后的此系列博文中我会扩展模型绑定,看看我们怎么能简单地将筛选场景融入我们的数据选择场景,还有如何处理编辑场景(包括那些使用验证的)。

希望这些对你有帮助。

Scott

[Scottgu]ASP.NET vNext系列——数据选择相关推荐

  1. Asp.net Vnext IValueProvider

    概述 本文已经同步到<Asp.net Vnext 系列教程 >中] IValueProvider 根据ValueProvider获取数据,在对数据进行绑定 代码实现 private cla ...

  2. [Asp.net MVC]Asp.net MVC5系列——添加数据

    目录 概述 显示添加数据时所用表单 处理HTTP-POST 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列--第一个项目 [Asp.net MVC]Asp.net MVC5系列 ...

  3. .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

    0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...

  4. 好消息,scott的asp.net 2.0数据导航系列全部出版了

    好消息,scott的asp.net 2.0数据导航系列全部出版了 好消息,scott的asp.net 2.0数据导航系列全部出版了,大师级的作品,共75篇, 分VB.NET和 c#版本,全面系统讲解了 ...

  5. 通过整数索引选择一行熊猫系列/数据框

    本文翻译自:Selecting a row of pandas series/dataframe by integer index I am curious as to why df[2] is no ...

  6. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云

    向视图中添加服务 现在,ASP.NET MVC 6 支持注入类到视图中,和VC类不同的是,对类是公开的.非嵌套或非抽象并没有限制.在这个例子中,我们创建了一个简单的类,用于统计代办事件.已完成事件和平 ...

  7. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  8. ASP.NET 5系列教程 (二):Hello World

    本篇文章内容比较基础,主要是向大家展示如何创建一个 ASP.NET 5 工程,主要包含内容如下: 创建ASP.NET 5 工程 添加 Todo 控制器 安装 K Version Manager 执行 ...

  9. asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core

    0. 前言 这是一个新的系列,名字是<http://ASP.NET Core 入门到实战>.这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我 ...

  10. 【ASP.NET Identity系列教程(三)】Identity高级技术

    注:本文是[ASP.NET Identity系列教程]的第三篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...

最新文章

  1. iOS lldb调试
  2. 一部手机,万物皆可复制粘贴,将AR玩出了新高度
  3. LeetCode 102. Binary Tree Level Order Traversal--递归,迭代-Python,Java解法
  4. Python中使用turtle绘制多个同心圆
  5. Synergy工具 共享Windows系统电脑Linux系统电脑 鼠标键盘
  6. Hawk搜索引擎平台0.6.9测试版(提供下载)
  7. python灰度图生成g代码_Python打造一个在线G代码生成器
  8. Leetcode每日一题:993.cousins-in-binary-tree(二叉树的堂兄弟节点)
  9. ArcGis连接oracle失败:ORA-6413:连接未打开
  10. 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
  11. java第14次作业
  12. 内存带宽stream测试
  13. 电脑进入安全模式的两种方法
  14. 完美解决Pyqt5 调用软键盘适用于触摸屏
  15. ROS2_Foxy学习1——前言与安装
  16. 按键精灵加密html,按键精灵HtmlCheck 选择/清除网页中的单选框或复选框 | 学步园...
  17. cad批量选择相同块_在CAD中怎样批量选择同类型的构件
  18. Nico的刷题日记(一)
  19. 【考研】数据结构考点——顺序查找
  20. arm-openwrt-linux-musl 交叉编译cyassl

热门文章

  1. linux压缩和备份工具
  2. Netlink 0002 -- 什么是Netlink
  3. G - 取石子游戏 HDU - 2516 (斐波那契博弈)
  4. C++STL之双端队列Deque
  5. BloomFilter, Count-Min Sketch算法
  6. 次导数 次梯度 小结
  7. 201约花鸟画 考c语言试题,全国计算机二级C语言上机100题..doc
  8. w ndoWs8pE模式下载,win7 PE
  9. java 幂函数_java的math常用方法
  10. 4号线地铁站点列表_7/4号线大连路地铁站:合租主卧家具齐全~