摘要:
上次写了点关于验证码制作的代码,算是学习了Drawing中的一些东西,心里很快活,也乐意为大伙儿做些善事,于是便萌发了把验证码封装成简单的控件发布出去的念头——起初是用ashx(一般处理程序,俗称Httphander)的做法,OK。在WebForm和MVC两种情况下毫无问题——代码很简单,假设把ashx放在程序根目录,那么你就在页面中对应弄上一个img即可:<img src="/Image.req"/>这样生成img标签自动也会请求这个handler,生成图片(不要忘记配置handler就可以了)。然后我想到要做一个dll,因为总觉得把ashx发布出去不是很正规 阅读全文
摘要:
网站上验证码效果一般制作方法是:1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中。2)页面中使用异步方式(js等)进行刷新当前页面的验证码。【示例】1)创建一个“一般应用处理程序ashx”,代码如下:[C#]public class ValidationCode : IHttpHandler { //随机发生器 static Random r = new Random(Guid.NewGuid().GetHashCode()); //排除黑色、透明色颜色,因为底色黑色 ... 阅读全文
摘要:
有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副本。其实这个操作主要分成三步走:1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):[C#]Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffe 阅读全文
摘要:
在上一章中您学习了如何使用EntityFramework和SQL Server Compact创建一个ASP.NET MVC程序存储展示数据,在本章中您将学习如何在控制器和视图中对自动生成的增删改查代码进行自定义。注意:为了在您的控制器和数据访问层中创建一个抽象层,通常的做法是实现一个“库模式”。不过为了使得这些教程变得更加简单,暂且不必实现此模式,我们将在稍后的“实现单元工作库模式”中得以完成。本章中您要创建以下一系列页面:【创建一个详细信息页】Index页面默认架构忽略了Enrollments属性,那是因为这是一个集合属性。在详细信息页中你将通过一个Html表展示此一系列内容。在“Cont 阅读全文
摘要:
在前几篇中你已经处理了由3个实体组成的数据模型,本章节中您将添加更多的数据实体以及关系,并且充分利用数据标注属性进一步地控制模型类的行为。以下便是当你完成这次任务之后完整的数据类模型:【使用属性控制格式化数据、数据验证及数据库映射】在这部分您将可以看到用于数据模型类的属性的若干例子,用以控制数据的格式化,验证以及数据库的映射。接着在稍后几章中您将创建一个完整的School数据模型,您通过对已经创建的类添加属性,并且通过创建新类用于维护模型中的实体类型。1)DisplayFormat属性:对于学生选课日期可能你在乎的仅是“日期”,但是显示的结果却都带有时间;使用数据标记属性你只需做一步代码的改变 阅读全文
摘要:
上一章中您已经为Students实体集实现了不同页面的增删改查的功能,本章中您将为Index页面给Students增加分页、过滤以及排序功能。你将创建一个实现简单分组功能的页面。以下就是即将你要看到的效果——列标题变得可以点击,我们可以通过点击对特定列进行排序;重复点击同意标题两次将会导致对该列进行“升序”或是“降序”排列。【对Students的Index页面增加排序列】为了增加排序列,你应当在Student控制器的Index方法中做如下变化:1)对Index方法增加排序功能:在“Controllers\StudentController.cs”文件里用以下代码替换Index方法中的代码:pu 阅读全文
摘要:
前一章你已经学会如何显示相关数据,在本章中你将学会如何更新相关数据。大部分情况下更新只需通过更新对应的外键字段即可完成,不过对“多对多”关系而言,由于EF不是直接暴露那个中间连接表,因此你不得不“显式”从对应的导航属性中增加或者删除实体得以完成。以下一些截图是你今日要完成的任务:【为Courses自定义“新增”和“编辑”页面】当一个新课程创建之时,它总是隶属于某一个特定的系;为方便期间,自生成“创建”和“编辑”的代码架构中就包含了一个可供选择“系”的下拉列表。下拉框设置了Department的Id,这是所有EntityFramework实体都有的,为了把正确的Department加载到Cour 阅读全文
摘要:
在前一章中你完成了复杂的学校数据模型,在本章节中你将读取并且展示这些相关数据——也就是EntityFramework加载到导航属性中的那些数据。以下截图展示你要完成的效果:【慢模式、饥饿模式以及显式加载相关数据】EntityFramework有几种方式把数据加载到导航属性中:1)慢模式:当实体第一次被读取的时候,相关的导航属性数据并未加载;当你第一次访问该导航属性的时候才使得导航属性的数据被加入。这会对数据库产生多个请求——一个是实体自身数据的加载,另外一个则是实体中那个导航属性相关数据每次的加载:2)饥饿模式:当实体被读取时,相关属性数据同时被加载;这会产生一个对数据库的请求以便加载相关全部 阅读全文
摘要:
上两章中你已经学会如何处理相关数据,本章将介绍如何处理并发冲突。为此你将创建若干页面处理Department信息,编辑删除Department信息的页面将采用并发冲突机制。以下一些截图展示了在Index和Delete页面中的状况,以及当检测到并发冲突的时候所显现的一些错误信息。【并发冲突】“并发冲突”就是指一个用户准备编辑一条实体记录的,同时另外一个用户在该用户之前已更新了同样的消息。倘若你不设置相关检测并发冲突的机制,那么永远是最后一个客户的变更信息覆盖先前一切更改。在许多情形下此风险是可以接受的(比如用户数量极少,更新也极少,或是即便一些数据被覆盖了也并不足以致命……),因此此时使用并发冲 阅读全文
摘要:
上一章你学习了继承,本章中你将学习如何在数据模型中实现继承。在“面向对象”的编程中你通常使用“继承”避免冗余代码,本章中你将让Instructor和Student两个模型类分别继承基本类Person,该类包含基本的共有属性(比如LastName等)。对于视图页面您无需做任何更改,不过你可能需要稍微更改一些代码,并且这些改变会在数据库中反映出来。【树形表结构VS继承表结构】在“面向对象”编程中,你使用继承使得相关类编码变得更为简单。举例来说——Instructor和Student两个模型类共享一些属性,结果导致了冗余代码的产生:假如你想消除由于Instructor和Student共享属性而带来的 阅读全文