3.1 MVC简介

MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。Asp.net MVC是微软提供的MVC开发框架。

MVC将UI层分为了三个部分:

  • 模型:一组类,描述了要处理的数据以及修改和操作数据的业务规则。
  • 视图:定义应用程序界面的显示方式。
  • 控制类:一组类,用于处理来自用户、整个应用程序流以及特定应用程序逻辑的通信。

3.2 第一个Asp.net MVC 应用程序

3.2.1 创建ASP.NET MVC 应用

用VS创建了一个新的ASP.NET MVC应用程序后,将自动向这个项目中添加一些文件和目录,如图所示3-1所示。

图3-1 asp.net mvc 项目目录结构

表3-1是对目录的说明

表3-1 asp.net mvc程序结构说明

目录

用途

/Controller

用于保存那些处理URL请求的Controller的派生类

/Models

用于保存那些表示和操纵数据以及业务对象的类

/Views

存那些负责呈现输出结果(如HTML)的UI模板文件

/Scripts

保存Js库文件和脚本

/fonts

用于保存Bootstrap模板系统中的字体文件

Content

用于保存CSS、图像和其他站点的内容,而非脚本

/App_Data

保存想要读取/写入的数据文件比如.mdf的本地数据库文件

/App_Start

保存一些同能的配置代码,路由等

3.2.2 ASP.NET MVC 工作原理

MVC模式的工作过程如图3-2所示。

图3-2 MVC工作过程

客户端的所请求的URL是被映射到相应的Controller去,然后由Controller来处理业务逻辑,或许要从Model中取数据,然后再由Controller选择合适的View返回给客户端。

我们运行的ASP.NET MVC程序访问的http://localhost:2176/Home/Index这个URL,它访问的其实是HomeController中的Index这个Action,如图3-3所示。

图3-3 URL对应关系

其中 public ActionResult Index() 这个方法称为Controller的Action,他返回的是ActionResult的类型。一个Controller可以有很多个Action。

那么一个URL是怎样被定位到Controller中来的呢?它是通过"路由"完成的,默认代码如下:

public class RouteConfig

{

public static void RegisterRoutes(RouteCollection routes)

{

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(

name: "Default",

url: "{controller}/{action}/{id}",

defaults: new { controller = "Home", action = "Index",

id = UrlParameter.Optional }

);

}

}

RegisterRoutes()方法的作用就是定义路由,即定义URL访问规则。我们可以看到这里定义了一个名为"Default"的Route,还定义了默认的参数。默认参数的意义在于,当我们访问例如http://localhost:2176/的URL的时候,他会将不存在的参数用默认的参数补上,也就是相当于访问http://localhost:2176/Home/Index一样。

在控制器中,使用View()方法调用视图,返回和动作方法同名的视图,但是却没有显示提供视图的位置。其实这里依赖的是视图的寻址规则,即会按照规则从规定的路径去寻找这个命名的视图。在ASP.NET MVC中,有一条寻址规则,就是从Views文件夹下和控制器名同名的文件夹中寻找。

ASP.NET MVC程序对于一次请求的处理过程如图3-4所示。最开始应用程序启动,注册路由;当请求到来时,寻找路由表找到负责处理的控制器和动作方法,交给该动作方法处理;动作方法处理完毕,根据寻址规则找到视图,由视图负责页面呈现。

图3-4 ASP.NET MVC 工作过程

ASP.NET MVC框架的一大特点就是"约定胜于配置",即一些规则是约定好的,不需要通过配置文件去配置。我们约定:

  • 所有的控制器都以Controller结尾。
  • 应用程序中所有视图都有一个统一的Views主目录。
  • 在Views主目录下放置和控制器同名的子目录。

3.3 ASP.NET 系统对象

对象名称

说明

Request

用来获取客户端在web请求期间发送的值,如URL参数、表单值等

Response

用来负责返回到客户端的HTTP输出

Application

作用于整个应用程序运行期间的状态对象,可用来保存整个应用程序的配置参数

Session

会话状态保持对象

Cookie

客户端保持会话信息的方式

Server

用于进行一些服务器端处理的工具对象,如URL,编码解码

HttpContext

封装有关个别HTTP请求的所有HTTP特定信息

3.3.1 Request对象

Request对象的常用成员如下:

成员

说明

String ContextType

获取设置传入请求的MIME内容类型

HttpCookieCollection Cookies

获取客户端发送的Cookie的集合

HttpFileCollection Files

获取由客户端上传的文件集合

NameValueCollection Form

获取表单提交的数据

NameValueCollection Headers

获取Http头信息

NameValueCollection QueryString

获取Http查询字符串变量集合

String RawUrl

获取当前请求的原始URL

NameValueCollection ServerVariables

获取web服务器变量集合

String UserAgent

获取客户端浏览器的原始用户代理信息

String UserHostAddress

获取远程客户端的IP地址

String MapPath(path)

将指定的虚拟路径映射到物理路径

Save()

将HTTP请求保存到磁盘

3.3.2 Response对象常用成员

成员

说明

String ContentType

获取或设置输出流的HTTP MIME类型

HttpCookieCollection Cookies

获取相应Cookie的集合

NameValueCollection Headers

获取相应标头的集合

Redirect(url)

将请求重定向到新的URL

Write(data)

将一个字符串写入HTTP相应输出流

3.3.3 Server对象常用成员

常用成员

说明

string MapPath(path)

返回与Web服务器上的指定虚拟路径相对应的物理文件路径

Transfer

使用指定的path路径进行转发

string UrlDecode

对字符串进行URL编码

string UrlEncode

对字符串进行URL解码

3.3.4 Session对象

在Asp.net 中,Session以key-value的方式在服务器端保存数据,它的使用方式非常简单,如下。

Session["Session名称"] = 值; //存值

变量 = Session["Session名称"]; //取值

Session对象常用成员:

常用成员

说明

string SessionId

包含唯一用户会话标识符,它可用与整个会话过程记录用户的信息

int Timeout

用户超时的时间,单位分钟。在该段时间内,用户即使没有任何操作用户的状态也不会清除。如果一段时间内没有操作,服务器无法知道用户是否在线,所以Session中的数据生存期以超时时间为限

Abandon()

结束Session,取消当前会话

Add(name,value)

添加Session数据

Remove(name)

删除数据

3.3.5 Cookie对象

语法:

Response.Cookies[Cookie的名称].Value = 变量值; //写入Cookie

string 变量 = Request.Cookies[Cookie的名称].Value; //读取Cookie

常用成员

说明

string Name

Cookie对象名称

string Value

Cookie对象的内容

DataTime Expires

Cookie对象的有效时间。如果没有设置Cookie的失效日期,它们仅保存到关闭浏览器程序为止;如果Cookie对象的Expires属性设置为DateTime.MaxValue,则表示Cookie永远不会过期

3.3.6 HttpContext对象

常用成员

说明

HttpApplicationState

Application

Application对象

HttpRequest Request

Request对象

HttpResponse

Response对象

HttpServerUtility

Server

Server对象

HttpSessionState

Session对象

Iprincipal User

User对象

Cache

Cache对象

static HttpContext

Current

为当前Http请求获取或设置HttpContext对象

3.4 案例:实现用户登录

需求:

  1. 记住密码功能
  2. 登录用户信息传递

3.4.1 跨域请求Session丢失问题解决方式

在登录控制器中引用命名空间
using System.Web.SessionState;

控制器实现 IRequiresSessionState 接口

public class AccountController : Controller, IRequiresSessionState

{

public ActionResult Login(string loginName,string loginPwd)

{

if (loginName=="admin" && loginPwd=="sa")

{

Session["User"] = "admin"; //可直接使用

return RedirectToAction("index", "book");

}

}

}

APS.NET MVC + EF (03)---初始MVC的更多相关文章

  1. 使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗

    安装MiniProfiler 在MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfile ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列

    http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...

  6. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

  7. 关于MVC EF架构及Repository模式的一点心得

    一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

随机推荐

  1. MATLAB读取一个文件夹下的多个子文件夹中的多个指定格式的文件

    MATLAB需要读取一个文件夹下的多个子文件夹中的指定格式文件,这里以读取*.JPG格式的文件为例 1.首先确定包含多个子文件夹的总文件夹 maindir = 'C:\Temp Folder'; 2. ...

  2. LCD裸板编程_框架

    lcd程序框架: 为了让程序更好的扩展,介绍面向对象编程: 比如抽象出lcd_3.5和lcd_4.3的共同点: 当我想使用3.5寸的lcd时,只需让lo指向lcd_3.5_opr即可.同样,当我想使用 ...

  3. 织梦dedecms后台文件media_add.php任意上传漏洞解决办法

    织梦在安装到阿里云服务器后阿里云后台会提示media_add.php后台文件任意上传漏洞,引起的文件是后台管理目录下的media_add.php文件,下面跟大家分享一下这个漏洞的修复方法: 首先找到并 ...

  4. NOIP 2014 比例简化

    洛谷 P2118 比例简化 洛谷传送门 JDOJ 2892: [NOIP2014]比例简化 T2 JDOJ传送门 Description 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结 ...

  5. ajax中什么时候进success和error

    先简单介绍下ajax: 简单的说Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState): -未初始化.-正在初始化.-发送数据.-正在发送数据.-完成. 当 ...

  6. celery异步任务、定时任务

    阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery   一 什么是Cele ...

  7. [考试]NOIP2015模拟题2

    // 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总 ...

  8. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall题解

    题目 二分图最大匹配问题 cow数组标现在牛栏里的牛是几号牛 每次寻找都要清空vis数组 如果可行有两种情况 1.这个牛栏里没有牛 2.这个牛栏里的牛可以到别的牛栏去 根据此递归即可 Code: #i ...

  9. java基础之 hashmap

    Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...

  10. 【Gamma】“北航社团帮”展示博客

    目录 团队介绍 项目愿景 整个项目的预期典型用户 功能展示 原预期用户数量 项目使用情况数据分析 用户量变化 学生认证人数 社长认证人数 入社申请数 活动发布 新闻发布 网页端使用情况 小程序打开次数 ...