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. SCI/EI期刊投稿 Reply Letter 常用格式总结

    SCI/EI期刊投稿Reply Letter常用格式总结          整个论文投稿的过程中,会遇到各种问题,需要我们向主编询问或是回复.下面主要总结了responses to the comme ...

  2. memcache相同主域名下的session共享

    本配置适合具有相同主域名的多台服务器进行session共享. 例如:www.lee.com , bbs.lee.com(多个子域名). 配置session保存在memcache: ini_set(&q ...

  3. 在CentOS上搭建apache和PHP服务器环境(转)

    1.您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/ 2. 安装: wget -c http:/ ...

  4. MVC缓存OutPutCache学习笔记 (一) 参数配置

    OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...

  5. jquery ajax 提交 FormData

    $('form').submit(function(){ var formdata=new FormData(this); $.ajax({ type:'POST', url:'/url/path', ...

  6. Html.RenderPartial、Html.RenderAction联系与区别

    1.引言 开发人员经常希望应用程序可以在多个不同的地方使用同样的Razor标签和HTML标记代码.这并不需要我们在多个地方重复这些标签,使用MVC中的分部视图和子动作可以让我们很好的解决类似的情况. ...

  7. 使用微信JS-SDK调用微信浏览器的接口

    先附上微信公众平台的相关链接: 微信公众平台:https://mp.weixin.qq.com/ 微信公众平台开发文档:https://mp.weixin.qq.com/wiki 微信公众平台JS-S ...

  8. gradle 默认属性

    Properties(未翻译) Property Description allprojects 包含该项目及其子项目的属性 ant The AntBuilder for this project. ...

  9. Redis 分布式session

    这里有三种和方式实现: 1.Harbour.RedisSessionStateStore , ServiceStack.Redis 配置web.config <sessionState mode ...

  10. vim does not map customized key?

    it is a long time confusing me that why my customized key map in vim does not work? Some vim configu ...