ASP.NET MVC+EF框架+EasyUI实现权限管理系列(11)-验证码实现和底层修改
(1)在前面我写ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑曾的封装 这篇博客的时候,有一位博友(@Qlin)提出了我在项目底层些查询的时候为什么不用Expression<Func<T,bool>>,因为当时我实现的代码是Func<T,bool> wherelambda来定义的,当时的代码如下:
1 //实现对数据库的查询 --简单查询
2 IQueryable<T> LoadEntities(Func<T, bool> whereLambda);
3
4 /// <summary>
5 /// 实现对数据的分页查询
6 /// </summary>
7
8 /// <typeparam name="S">按照某个类进行排序</typeparam>
9
10 /// <param name="pageIndex">当前第几页</param>
11
12 /// <param name="pageSize">一页显示多少条数据</param>
13
14 /// <param name="total">总条数</param>
15
16 /// <param name="whereLambda">取得排序的条件</param>
17
18 /// <param name="isAsc">如何排序,根据倒叙还是升序</param>
19
20 /// <param name="orderByLambda">根据那个字段进行排序</param>
21
22 /// <returns></returns>
23
24 IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Func<T, bool> whereLambda, bool isAsc, Func<T, S> orderByLambda); (2)那么根据那位博友提出来的意见,我查看资料,发现他们还真的有很大的区别,这里我就简单的说一下他们的区别,并且非常感谢博友们能提出这样的问题,希望广大博友们能真心的提出来项目中的问题,我将虚心接受。
(3)那么他们有什么区别呢?网上的资料是这样说的,Func<T,bool>本身就是一个委托(delegate),而Expression<Func<T,bool>>确实一个表达式,只有在编译之后才会变成委托,那么在EF中到底使用哪一个呢?又是为什么呢?其实如果我们写成Func<T,bool>类型的便来那个如果作为参数传递给where方法进行Linq查询时,Entity FrameWork将会产生全表查询,将整个数据库表忠的数据加载到内存中,然后再内存中根据where中的条件进一步查询,而Expression<Func<t,bool>>只是查询出来你where条件中的数据,不用去进行全表查询,所以我们修改后的代码是:
1 //实现对数据库的查询 --简单查询
2
3 IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
4
5 /// <summary>
6
7 /// 实现对数据的分页查询
8
9 /// </summary>
10
11 /// <typeparam name="S">按照某个类进行排序</typeparam>
12
13 /// <param name="pageIndex">当前第几页</param>
14
15 /// <param name="pageSize">一页显示多少条数据</param>
16
17 /// <param name="total">总条数</param>
18
19 /// <param name="whereLambda">取得排序的条件</param>
20
21 /// <param name="isAsc">如何排序,根据倒叙还是升序</param>
22
23 /// <param name="orderByLambda">根据那个字段进行排序</param>
24
25 /// <returns></returns>
26
27 IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Expression<Func<T, bool>> whereLambda,
28
29 bool isAsc, Expression<Func<T, S>> orderByLambda); (4)上面我们简单的介绍了一下Func<T, bool>和Expression<Func<T, bool>>的使用区别,我查到了就这些资料,如果那位博友还能够详细的说明的话,真心希望你在下面留言,我将非常的感谢你们。
(5)综上所述的话,这时候我们就要对我们项目中数据库访问层,数据库访问接口层,业务逻辑层和业务逻辑接口层的查询方法都进行修改,这里就不多说了,和上面的基本差不多。
2.登录页面的设计
(1)首先我们到网上下载一个登录页面的Demo,然后经过修改之后放到我们MVC4的项目里面。
(2)然后我们在项目中添加一个LoginController控制器,然后再在Index上面添加一个空视图,最后我们将我们前面下载的Demo中的代码部署到Index.cshtml页面之上,最后生成的静态页面如图所示:
(3)这时候我们就把静态页面设计好了,这里静态页面的代码我就不往出来贴了,在后面我会把主要的代码写出来的并且共享整个项目的,那么下来我们看到了我们的验证码没有实现,只是一个假的图标在哪里,这时候我们开始着手验证码的设计。
3.如何设计验证码的实现
(1)通过上图我们看到现在我们已经实现了页面的展示,那么我们的验证码还没有,现在开始我们设计验证码,首先看我前台验证码这里的代码是:
1 <ul>
2
3 <li class="user_main_text">验证码: </li>
4
5 <li class="user_main_input">
6
7 <input type="text" class="TxtPasswordCssClass" id="Code" name="Code">
8
9 </li>
10
11 </ul>
12
13 <ul>
14
15 <li class="user_main_text">验证码: </li>
16
17 <li class="user_main_input">
18
19 <img src="/Login/CheckCode?ID=1" id="imgCode" alt="单击可刷新" onclick="ClickRemoveChangeCode()" />
20
21 <a href="javascript:void(0)" onclick="ClickRemoveChangeCode();return false;">看不清</a>
22
23 </li>
24
25 </ul> (2)首先我们看到我们绑定验证码的这里是这样写的,<img src=”/Login/CheckCode?ID=1”>,那么前面的src绑定的地址什么意思呢?他的意思就是我们在Login控制器下面含有一个CheckCode方法来实现验证码的读取。
(3)我们要实现验证码,首先我们就要写一个生成验证码的类,没什么难度,网上一搜一大推,下面就是我封装的生成验证码的类,首先我们在LYZJ.UserLimitMVC.Common类库下面新建一个KenceryValidateCode.cs类来存放生成验证码的代码,在这里我们需要给类库引入命名空间System.Drawing。最终的代码如下:
1 namespace LYZJ.UserLimitMVC.Common
2
3 {
4
5 public class KenceryValidateCode
6
补充:Web开发 , ASP.Net ,