APS.NET MVC + EF (03)---初始MVC
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 案例:实现用户登录
需求:
- 记住密码功能
- 登录用户信息传递
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的更多相关文章
- 使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗
安装MiniProfiler 在MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfile ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...
- ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序
不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...
- 关于MVC EF架构及Repository模式的一点心得
一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
随机推荐
- Bash Shell中的特殊位置变量及其应用
Bash Shell中的特殊位置变量及其应用 众所周知bash shell中有许多特殊的位置变量,灵活使用它们可以更好地发挥Shell脚本的功用. 即位置变量:$1,$2,...来表示,用于让脚本在脚 ...
- centos7利用acme.sh获取Let's Encrypt的永久免费ssl证书并配置网站域名https访问
acme.sh介绍:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E github:https://github.com/Neil ...
- CentOS 7 安装配置分布式文件系统 FastDFS 5.0.5
前言 项目中用到文件服务器,有朋友推荐用FastDFS,所以就了解学习了一番,感觉确实颇为强大,在此再次感谢淘宝资深架构师余庆大神开源了如此优秀的轻量级分布式文件系统,本篇文章就记录一下FastDFS ...
- pandas 生成并排放置的条形图和箱线图
1.代码 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 生成数据,创建 DataFrame np.r ...
- 遇到libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `.rodata.str1.1' ca时
glfag编译成动态库gflags 正确的安装方法是这样的: Need cmake >2.8.4 (current is 2.8.3) mkdir build cd build cmake -D ...
- curl-7.21.2
curl 源码编译 自己定义的库编译 https://blog.csdn.net/initiallht/article/details/92655025 静态库,debug,x86nmake /f M ...
- arXiv上传文章latex源码技巧
<<2019.09.27>>更新 上传PS文件看来也是不行了,一大早收到邮件被arXiv标记为incomplete了.哎,还是老老实实提交Latex source files吧 ...
- MySQL 学习网站
[大型网站] CSDN论坛MySQL版块 https://bbs.csdn.net/forums/MySQL MySlide搜索MySQL https://myslide.cn/slides/1758 ...
- MyBatisSystemException 【exception】
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: ...
- java 8 学习二(Lambda表达式)
粗略的概括:lambda表达式主要用来实现“函数接口”中“唯一”的抽象方法用的. 他的特殊版有 方法引用,构造函数引用,用对应的接口实例接收即可. 可以把Lambda表达式理解为简洁地表示可传递的匿名 ...