【MVC】ASP.NET MVC 4项目模板的结构简介
引言
在VS2012新建一个窗体验证的MVC 4项目后,可以看到微软已经帮我们做了很多了,项目里面该有的都有了,完全可以看成一个简单网站.作为开发,能理解里面文件结构和作用,也算是半只脚踏进MVC的大门了.下面依次介绍其中的文件作用.
App_Start
AuthConfig.cs
AuthConfig类的RegisterAuth用来注册外部登录,具体作用在于用户可以用外部的账号登录本网站.
BundleConfig.cs
BundleConfig类的RegisterBundles可以将我们项目中的多个css样式文件或js脚本文件合并和精简成一个文件,优化页面加载时间,而且也令我们的View看起来整洁些.如
@Styles.Render("~/Content/themes/base/css")
相当于
<link rel="stylesheet" type="text/css" href="Content/themes/base/jquery.ui.core.css" />
<link rel="stylesheet" type="text/css" href="Content/themes/base/jquery.ui.resizable.css" />
........
FilterConfig.cs
FilterConfig类的RegisterGlobalFilters用来注册全局过滤器,项目代码中已经注册了HandleErrorAttribute过滤器,要让它起作用,还需要在根目录的Web.Config中<system.web>节点添加
<customErrors mode="On" defaultRedirect="Error" />
在Action发生异常时,就会重定向Error.cshtml页面.具体用法可以参考大叔手记(6):巧用ASP.net MVC3里的HandleErrorAttribute.
还有可能用到的是AuthorizeAttribute,添加全局的授权限制.
filters.Add(new AuthorizeAttribute());
RouteConfig.cs
RouteConfig类的RegisterRoutes用来定义URL路由的.
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
上面代码解析:{resource}.axd 表示后缀名为.axd所有资源 如webresource.axd, {*pathInfo} 表示所有路径.作用是当URL匹配到此路由时,不交给MVC的路由机制处理,而交给标准的ASP.NET处 理程序处理.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这段代码定义了一个路由映射,其中{controller}{action}是MVC中的特定参数,用来匹配控制器和动作的.最后一个参数还设置了默认值,其中UrlParameter.Optional代表的参数可选的意思.产生的效 果就是当我们直接打开主页时,路由管道经过一系列的运作,最终实例化HomeControl,并调用其中的Index方法.
WebApiConfig.cs
WebApiConfig.Register用于注册Web API的路由映射.
定义的方式和正常的MVC路由差不多,不同的是Web API的路由没有{action}指令,它会根据URL的{controller}参数和HTTP动词寻找相应的操作,例如一个get请求,路由机制就会寻找{controller} 中的带get开头的方法.
Content
里面都是一些CSS样式文件.
Controllers
MVC模式中的C,Controller主要负责数据输入输出.项目中有两个控制器,AccountController,HomeController.这里主要介绍AccountController.
[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{}
首先是命名,控制器都是基于命名约定的,后缀必须带Controller.
[Authorize]特性表示在执行控制器里面的所有操作前必须进行得到授权(也就是要登录),如果没有得到授权则会产生一个HTTP401的状态码,会被FormAuthenticationModule的Onleave捕获,
然后重定向到Web.config设置的Login页面.
[InitializeSimpleMembership]初始化SimpleMembership,作用在于确保执行权限相关操作前已经初始化数据库.
MVC笔记 Controller相关技术 MVC Controller 这两个链接有对Controller有更详细的描述.
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
} // 如果我们进行到这一步时某个地方出错,则重新显示表单
ModelState.AddModelError("", "提供的用户名或密码不正确。");
return View(model);
}
上面是Login操作的代码.
[HttpPost]特性表示只处理http动词为Post的请求.
[AllowAnonymous]特性表示,没有得到授权的情况下也可以执行此操作.
[ValidateAntiForgeryToken]特性表示令牌验证,配合View的Html.AntiForgeryToken()使用的,主要是为了防止CSRF攻击.
ModelState.IsValid检查View绑定的model状态是否有效.
RedirectToLocal 表示登录成功后返回到原来的页面上,此方法也做了防止重定向攻击的措施.
ModelState.AddModelError("", "提供的用户名或密码不正确。") 将错误信息显示在View中,配合View的Html.ValidationSummary(true)使用.
return View(model) 返回ViewResult,如果没有指定View名称,则会默认方法名Login作为View名称.
Filters
InitializeSimpleMembershipAttribute.cs
InitializeSimpleMembershipAttribute特性表示在执行操作之前,要对UsersContext进行相关的数据表创建.
我们可以在SimpleMembershipInitializer的构造函数中添加账号和角色,如
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); if (!WebSecurity.UserExists("czl"))
{
WebSecurity.CreateUserAndAccount("czl", "");
} if (!Roles.RoleExists("admin"))
{
Roles.CreateRole("admin");
if (!Roles.IsUserInRole("czl", "admin"))
{
Roles.AddUserToRole("czl", "admin");
}
}
Images
存在网站图片.
Models
AccountModels.cs
MVC中的M,Model视图模型.
public class UsersContext : DbContext
{
public UsersContext()
: base("DefaultConnection")
{
} public DbSet<UserProfile> UserProfiles { get; set; }
} [Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
上面使用EF的Code First的方式创建数据表UserProfile.
public class LoginModel
{
[Required]
[Display(Name = "用户名")]
public string UserName { get; set; } [Required]
[DataType(DataType.Password)]
[Display(Name = "密码")]
public string Password { get; set; } [Display(Name = "记住我?")]
public bool RememberMe { get; set; }
}
这是其中一个视图模型,用于绑定View.
[Required]特性表示不能为空,如果为空则在ModelState添加一条错误的提示.
[DataType(DataType.Password)]特性配合View中html辅助方法可以生成一个类型为password的输入元素.
[Display(Name = "密码")]特性配合html辅助方法可以生成一个密码的标签.
Scripts
存放JS脚本文件.
Views
MVC中的V,视图.和用户交互的页面.
首先注意到是Views的目录结构,一般都是Controller名字的文件夹下面存放相关的View文件.
_ViewStart.cshtml
此视图优先于其他视图运行,一般的作用是给其他视图设置Layout 为_Layout.cshtml.
Web.config
这个config只作用于View,可以在<namespaces>节点下添加常用命名空间,这样在绑定模型的时候可以不用写上命名空间.
Shared
_Layout.cshtml是母版页面,利用RenderBody()将子View中的内容显示出来.
_LoginPartial.cshtml登录栏的部分视图,被Html.Partial("_LoginPartial")读取显示.
Error.cshtml默认的错误显示页面.
Account和Home
内容好多.....要掌握Razor语法,Html的扩展方法,Ajax的扩展方法等...
Global.asax
Application_Start方法一般执行各种类的注册,主要是App_Start下的类注册,EF的数据库初始化也是放在这里执行的.
Web.config
要注意的是定义了授权页面的路径,如下.
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
还有子文件Web.Debug.config和Web.Release.config在不同的模式下,可以对主Web.config的某些设置进行替换.
执行流程
到此为止,上面说的都是一些零零碎碎的东西,想要理解还需对MVC的执行流程要有一个初步的了解,例如当浏览器发出一个URL为http://localhost:44998/的请求.
1.当这个请求到达IIS时,会经过一系列实现IHttpModule的类处理,其中有UrlRoutingModule.此类尝试匹配RouteTable的路由.
2.匹配成功会得到一个Route实例.根据URL和路由规则,将会得到路由数据{controller:home,action:index}.该实例中有个实现了IRouteHandler接口的属性,通过调用其中GetHttpHandler方法,得到MvcRouteHandler实例.
3.接着会调用MvcRouteHandler实例中ProcessRequest方法,这个时候开始实例化我们的控制器home,并调用index方法.
4.在方法返回时,会调用ActionResult.ExecuteResult(),这个时候视图引擎先渲染Index.cshtml,再渲染_Layout.cshtml,将数据写进Response.
5.返回Response给浏览器,呈现页面.
参考ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
ASP.NET MVC的流程讲解
小结
要学习"My name is Cai."这么一句英文,你大概要做的是要理解里面每个单词的意思,再理解整句话的意思和其中的语法.事实上,学习其它知识的方法都是相似的.显然,本篇博客不是什么好文,但是我觉得这种方式比较易学些.
【MVC】ASP.NET MVC 4项目模板的结构简介的更多相关文章
- [Asp.net mvc]Asp.net mvc 中使用LocalStorage
目前使用比较多的本地存储方案有比如Flash SharedObject.Google Gears.Cookie.LocalStorage.User Data.Open Database等方案.综合比较 ...
- MVC ASP.NET MVC各个版本的区别
ASP.NET MVC各个版本的区别 Net Framework4.5是不支持安装在window server 2003上,如非装请用net framework4.0; MVC1.0 publsh t ...
- [Asp.net mvc] Asp.net mvc Kendo UI Grid的使用(四)
有段时间没写博客了,工作状态比较忙,抽空继续总结下Grid的使用,这次主要介绍模板以及其他官网介绍不详尽的使用方法.先Show出数据,然后讲解下.后台代码: public ActionResult O ...
- MVC ASP.NET MVC各个版本的区别 (转)
Net Framework4.5是不支持安装在window server 2003上,如非装请用net framework4.0; MVC1.0 publsh time:2008 IDEV:VS200 ...
- [Asp.net mvc]Asp.net mvc 使用Json传递数据
在之前的练习中一直是直接传递的Model到后台或是单个数据到后台,今天在使用中遇到了点问题,不能使用Model传递到后台,但又要实现多个数据到后台,实验了多次有了以下的解决方案,给自己留个笔记. 功能 ...
- SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板
ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...
- 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2
----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...
- ASP.NET MVC 入门2、项目的目录结构与核心的DLL
我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...
- [转]ASP.NET MVC 入门2、项目的目录结构与核心的DLL
我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...
随机推荐
- talib 中文文档(八): Momentum Indicator Functions 动量指标
Momentum Indicator Functions ADX - Average Directional Movement Index 函数名:ADX 名称:平均趋向指数 简介:使用ADX指标,指 ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
- Git学习-->GitLab如何屏蔽掉注册功能?
一.背景 最近发现我在公司内部搭建的GitLab平台上关于账号出现了以下几个问题: 莫名其妙出现很多陌生人的账号 团队成员的很多账户注册填写的Email和UserName都不符合规范 本来一开始是打算 ...
- Day01 html详解
day01 html详解 1.html的简介 1.1 什么是html? - HyperText Markup Language:超文本标记语言,网页语言 ...
- MonkeyScript使用教程
原文地址https://www.cnblogs.com/yizhou-xu/p/8072813.html 原文地址https://www.cnblogs.com/YatHo/p/7205162.htm ...
- C++虚函数分析
1.虚函数(impure virtual) c++虚函数主要是提供“运行时多态”,父类提供虚函数的默认实现,子类可以虚函数进行重写. 2.纯虚函数(pure virtual) c++纯虚函 ...
- Vue学习笔记之Vue组件
0x00 前言 vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例 ...
- 20155201 实验三《Java面向对象程序设计》实验报告
20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...
- 2017-2018-1 JaWorld 团队作业--冲刺3
2017-2018-1 JaWorld 团队作业--冲刺3 (20162306) 总体架构 我们本次团队项目设定为基于Android系统Java架构下的打飞机小游戏 游戏中所有模型的原型设定是精灵,因 ...
- Applet再学习
ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...