引言

    在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项目模板的结构简介的更多相关文章

  1. [Asp.net mvc]Asp.net mvc 中使用LocalStorage

    目前使用比较多的本地存储方案有比如Flash SharedObject.Google Gears.Cookie.LocalStorage.User Data.Open Database等方案.综合比较 ...

  2. MVC ASP.NET MVC各个版本的区别

    ASP.NET MVC各个版本的区别 Net Framework4.5是不支持安装在window server 2003上,如非装请用net framework4.0; MVC1.0 publsh t ...

  3. [Asp.net mvc] Asp.net mvc Kendo UI Grid的使用(四)

    有段时间没写博客了,工作状态比较忙,抽空继续总结下Grid的使用,这次主要介绍模板以及其他官网介绍不详尽的使用方法.先Show出数据,然后讲解下.后台代码: public ActionResult O ...

  4. MVC ASP.NET MVC各个版本的区别 (转)

    Net Framework4.5是不支持安装在window server 2003上,如非装请用net framework4.0; MVC1.0 publsh time:2008 IDEV:VS200 ...

  5. [Asp.net mvc]Asp.net mvc 使用Json传递数据

    在之前的练习中一直是直接传递的Model到后台或是单个数据到后台,今天在使用中遇到了点问题,不能使用Model传递到后台,但又要实现多个数据到后台,实验了多次有了以下的解决方案,给自己留个笔记. 功能 ...

  6. SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板

    ASP.NET MVC 4 互联网模板中添加一些新的. 非常有用的功能,构建 SimpleMembership.这些更改将添加一些很有特色,像很多更简单. 可扩展会员 API 和 OAuth 的支持. ...

  7. 如何将一个 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 ...

  8. ASP.NET MVC 入门2、项目的目录结构与核心的DLL

    我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...

  9. [转]ASP.NET MVC 入门2、项目的目录结构与核心的DLL

    我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...

随机推荐

  1. Redis缓冲区设置

    对于Redis服务器的输出(也就是命令的返回值)来说,其大小通常是不可控制的.有可能一个简单的命令,能够产生体积庞大的返回数据.另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送 ...

  2. 小米范工具系列之六:小米范 web查找器2.x版本发布

    小米范web查找器是一款快速识别端口及服务的小工具. 此工具使用java 1.8以上版本运行. 下载地址:http://pan.baidu.com/s/1c1NDSVe  文件名web finder ...

  3. centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

    centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数 ...

  4. Django Rest Framework(3)-----APIView与Viewsets

    REST framework提供了一个APIView类,它是Django的View类的子类. REST framework主要的几种view以及他们之间的关系: mixins 到目前为止,我们使用的创 ...

  5. namenode 问题小记

    问题1:namenode进程故障 Namenode挂掉,Namenode gc日志里面YGC报错promotion failed 现象描述 NameNode进程挂掉,Namenode gc日志里面YG ...

  6. Selenium之Chrome浏览器的启动

    1.下载Chromedriver.exe文件放至需要的目录中: 2.编写代码 import org.openqa.selenium.WebDriver; import org.openqa.selen ...

  7. 两个栈实现队列&两个栈实现队列

    为说明思想,假设队列.栈都很大,不会出现满的情况. 1. 两个栈实现队列 //前提已知: struct Stack { int top; //栈顶指针 int stacksize;//栈的大小 int ...

  8. 4.9 Routing -- Query Parameters

    一.概述 1. 在URL中查询参数是可选的key-value对,出现在?的右边.例如,下面的URL有两个查询参数,sort和page,对应的值分别是ASC和2. example:http://exam ...

  9. 5.1 Components — Introduction

    1. HTML被设计的时候,浏览器是一个简单的文件浏览器.开发构建大的Web应用程序需要更多的东西. 2. 不是试图取代HTML,然而,Ember.js拥抱它,然后增加了许多新功能使得构建web应用程 ...

  10. Java transient关键字的理解

    transient [ˈtrænziənt] adj. 短暂的; 转瞬即逝的; 临时的 n 临时旅客; 瞬变现象; 候鸟; 1. transient的作用及使用方法       我们都知道一个对象只要 ...