Asp.net MVC网站的基本结构:
Controller->IBLL(定义业务接口)->BLL->DA(调用Utility)->数据库 ,其中A->B表示A调用B

1.Web网站,主要包括Controller类(内含一系列Action方法),视图即cshtml页面,各个视图公用的js脚本,图片文件,css样式文件。

Controller只负责接收页面通过URL或者Post方法发送的请求,然后返回视图,不做逻辑判断,逻辑判断统统放在BLL层来做。

视图即cshtml页面通过<script>标签引用公用的js脚本(或者在每个页面单独写js或jquery)向Controller的某个Actiona发送jax请求,Action方法再将请求的参数传到BLL获取数据。Action获取到数据之后就会返回结果,结果(必须是ActionResult的子类,ActionResult的之类可以是视图或者数据比如JsonResult)可以是包含获取到数据的某个新视图(通过ViewBag将数据传给该视图),也可以仅仅是数据,如果是数据,那么原来发送ajax请求的视图将获取到该数据,并通过原来的ajax请求的callback回调方法接收并处理该数据,如显示在当前页面的某个div或table里。

Controller为了使用BLL的方法,是直接使用对应的BLL还是通过IBLL?

答案是使用IBLL,作为接口,IBLL能够调用实现了其接口方法的BLL,具体做法是,在Controller中定义几个IBLL的变量,然后在构造方法中通过IOC将IBLL变量进行实例化。然后Action方法中,就用这些IBLL变量调用BLL层的方法。

2.IBLL层,这一层只定义业务接口方法,不做实现,这一层感觉有点鸡肋,只是为了让BLL层的方法符合IBLL的规范。

3.BLL层,实现IBLL的接口方法,主要实现方式是通过调用DAL的方法来访问数据库获取数据(或将数据通过DAL的方法存入数据库),或保存数据到数据库。
并且BLL负责对获取到的数据进行加工,如逻辑判断,将获取到的数据进行重新组装,封装成视图能直接用的ModelView,用户输入的后台验证,数据库报错信息的异常处理等。

4.DAL层,定义具体的操作数据库的方法。主要方法的参数为SearchModel(用于从数据库查询)或对应数据库表的Model(用于保存到数据库),但也有个别方法可能为了配合BLL的某些具体需要,DAL方法不需要参数或者参数为基本类型,如int等。

在DAL层直接写SQL语句(或者调用存储过程)来获取数据或者保存数据。

5.Entity层,一系列用于封装数据的实体类,是通信载体,是对数据的封装。Entity主要包括Model和ModelView两种实体类。根据需要Entity层还可以包括一些自定义的枚举等。

一个Model类直接对应数据库的一个表,字段与表中一样,例如可以对实体类添加Attribute(属性)修饰符,例如对StudentModel类添加[Table(Name = "table_student")],可以使得StudentModel类对应数据库的table_student表(当然需要用代码来识别这种对应关系)。

但是有了Model还不够,应为前台的视图展示的数据可能与数据库表中字段有些差异,这就需要被称为ModelView的实体类。

顾名思义,ModelView就是为了给View即视图使用的,它是对Model的再封装。具体做法是各个ModelView从相对应的Model继承,这样Model有的字段ModelView都有,并且可以添加Model中不存在,但视图又需要的字段。这样DAL和BLL的方法返回一个ModelView类型的数据,视图就能不经过处理直接使用了。

另外,一个实用技巧是,在信息管理系统这样的网站中,经常会有用户会在前台页面输入几个查询条件,查询一些东西以求得到一些列表或报表这样的场景,这时我们可以把用户的查询条件封装成一个Model实体类,叫SearchModel,比如查询学生的StudentSearchModel,查询商品的ProductSearchModel,

这样前台页面发送ajax请求时,就发送一个SearchModel到Controller的Action方法,然后Controller与BLL,BLL与DAL之间通信的载体都使用SearchModel(即BLL,DAL方法的参数为SearchModel,而不是SearchModel具体的几个字段),这样假如前台需要增加一个查询条件时,只需要给SearchModel增加一个字段即可,再把前台ajax请求修改一下(多发送一个字段),而不需要修改BLL,DAL方法的定义,非常方便。

6.Utility,主要是一些工具方法,例如操作数据库的基本方法,比如执行查询,创建连接,执行事务等,还有一些工具方法,比如字符串处理,正则表达式验证等,DAL及BLL可能会用到这些方法.

7.数据库,包括基本表,和一大堆视图,对于复杂的操作还需要存储过程。

视图主要是为了查询方便,DAL获取到的数据主要通过从视图进行查询,比较少直接从基本表查询,因为很多情况下,查询是为给前台页面提供数据,
而前台页面需要的数据通常比较人性化,不会像基本数据表那么规范,而且基本表一般比较详细,字段很多,而前台用到的数据往往需要来自好几个表,但对每个表都只需要其中一两个字段。
因此需要视图预先写好select语句,将需要的数据封装好再用。

8.视图页面(cshtml)

asp.net mvc对比asp.net webform比较大的不同是web form的页面aspx还有后台代码一说,两者是一起的,而mvc把视图和控制器进行了分割,控制器的代码就可以脱离视图,很方便地对action的结果进行测试。另外控制器的每个action方法都可以返回一个视图。

web form模式下,通过服务器控件,后台代码可以直接操作页面,读取控件的值,将数据绑定到控件上等等操作。而mvc没有了web form的服务器控件,如何操作页面呢,答案是controller或者说action再也不能操作页面,包括为控件赋值,完成数据绑定等操作,action方法只能生成页面或者返回数据。

这就需要我们页面上自己写js方法来向action发送请求,获取到action返回的数据之后,再用js代码实现数据的绑定和展示。因此用mvc模式做网站需要程序员对js很熟悉,基本的用jquery发送ajax请求,然后自己写好回调函数处理response,实现数据的动态加载,url跳转等都要会。

视图向action传递数据,主要是发送ajax请求,在请求内包含数据参数,以这样的形式。而控制器的action向视图传递数据除了直接返回数据,例如json之外,还可以用ViewBag和ViewData,例如,ViewBag.stuList=myStuList;视图再通过js代码用 "@" 符号,用var stuList= @ViewBag.stuList;获取数据,然后用js读取stuList变量,遍历时动态生成<tr><td>标签等,将数据展示出来。

注意:html代码和js代码中可以嵌入c#代码,只需要在每一句代码或者每一个代码块(用花括号包围)前加上"@"符号即可,如果需要换行,则在下一行的c#代码前也需要加上"@"符号。

例如:

<table>

@foreach(var item in mylist)
{
<tr>
<td>@item.id</td> <td>@item.name</td>
@if(item.age<)
{
<td>未成年</td>
}
@else
{
<td>@item.age 岁</td>
}
</tr>
}
</table>

还有这样一种常用的编程模式:
StudentController有一个Action即默认的Index()方法,当用户在浏览器跳转到http://localhost:8080/Student时,Index方法返回一个空的视图页面(即Index视图),
然后在视图内添加js代码,这段js代码是向StudentController发送ajax请求,请求的Action是GetStudentInfo()方法(url是http://localhost:8080/Student/GetStudentInfo),该方法通过BLL获取到数据之后进行返回,
向Index视图返回一个Json格式的List<Student>。Index视图再通过ajax请求中事先定义好的回调方法读取返回的数据,并加载到Index视图中。

还有另外一种做法,就是在用户请求http://localhost:8080/Student时,在Index方法内先通过BLL获取数据,然后在生成Index视图时直接把数据通过ViewBag传给视图,于是生成的视图已经包含了数据,无需再请求其他Action方法。

对比这两种做法,前者在响应速度上更快,因为它先生成了一个页面并返回给客户端,虽然是空页面。另外,它把读取数据的过程放在另外一个Action里,这样就使得该读取数据的Action更简单。而第二种做法的主要问题是读取数据的过程比较耗时,响应速度比较慢。

其他MVC基本知识:asp.net mvc 入门资料

 

Asp.net MVC网站的基本结构的更多相关文章

  1. IIS部署asp.net mvc网站

    iis配置简单的ASP.NET MVC网站编译器:VS 2013本地IIS:IIS 7操作系统:win 7MVC版本:ASP.NET MVC4sql server版本: 2008 r2 打开VS 20 ...

  2. 用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站

    从ASP.NET MVC第一个版本开始到现在,创建ASP.NET MVC项目的官方方法只有一个,“文件”->“新建”->“项目”,然后选择ASP.NET MVC X Web应用程序. 这种 ...

  3. 关于linux asp.net MVC网站中 httpHandlers配置无效的处理方法

    近期有Jexus用户反映,在Linux ASP.NET MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404( ...

  4. ASP.NET MVC 网站开发总结(三) ——图片截图上传

    本着简洁直接,我们就直奔主题吧,这里需要使用到一个网页在线截图插件imgareaselect(请自行下载). 前台页面: <!DOCTYPE html> <html> < ...

  5. 总结一下ASP.NET MVC 网站的部署问题

    总结一下ASP.NET MVC 网站的部署问题 近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到II ...

  6. 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅

    做了多年的Web开发工作,网站部署也不在话下,可每次部署却并不是十分顺利,将本次在阿里云服务器上部署asp.net mvc网站遇到的问题记录如下. 平台是阿里云ECS,操作系统是 Windows Se ...

  7. 在Windows Azure上创建ASP.NET MVC网站

    本篇体验在Windows Azure上创建ASP.NET MVC网站. →登录到Windows Azure管理门户 →点击左下方的"新建" →点击"自定义创建" ...

  8. 【转载】Asp.Net MVC网站提交富文本HTML标签内容抛出异常

    今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...

  9. 【转载】 Asp.Net MVC网站提交富文本HTML标签内容抛出异常

    今天开发一个ASP.NET MVC网站时,有个页面使用到了FCKEditor富文本编辑器,通过Post方式提交内容时候抛出异常,仔细分析后得出应该是服务器阻止了带有HTML标签内容的提交操作,ASP. ...

随机推荐

  1. Sky Box

    http://www.keithlantz.net/2011/10/rendering-a-skybox-using-a-cube-map-with-opengl-and-glsl/ http://o ...

  2. LeetCode —— Merge k Sorted Lists

    /* ** 算法的思路: ** 1.将k个链表的首元素进行建堆 ** 2.从堆中取出最小的元素,放到链表中 ** 3.如果取出元素的有后续的元素,则放入堆中,若没有则转步骤2,直到堆为空 */ #in ...

  3. 用Open Live Account写博文的第一篇文章,立个flag

    在设置的时候出了点问题,还好有blog这种神器,直接上网址http://www.cnblogs.com/yishujun/p/5328617.html 高亮插件来自 http://www.cnblog ...

  4. VS2013快捷键大全

    Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...

  5. ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...

  6. redis缓存分页数据ID

    1.用户通过分类.属性进来分页时 如果没有缓存,就读数据库前10页的数据Id,转为json,根据cate_分类1+cate_分类2+cate_分类3+arr_属性1+arr_属性2+arr_属性3作为 ...

  7. mysql中获取一天、一周、一月时间数据的各种sql语句写法

    今天抽时间整理了一篇mysql中与天.周.月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表.插入2条数据,便于部分数据的测试,其中 ...

  8. jQuery parent.append和$after的区别

    首先假设我们有个id为test的div和一个id为test2的div: <div id="test">     我是测试div </div> <div ...

  9. Js设置及获取Cookie的方法

    Login页面设置Cookie: <script type="text/javascript"> if(json.result=="true") { ...

  10. 黄学长模拟day1 大逃亡

    给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...