创建第一个MVC程序

我们先创建一个ASP.NET Web程序

模板选择MVC,因为不想使用默认的身份认证我们点击更改身份认证并选择不进行身份认证。

创建的项目结构如下:

配置与初始化

Web配置文件

查看项目的web.config文,首先是appSettings

<appSettings>

<add key="webpages:Version" value="3.0.0.0" />

<add key="webpages:Enabled" value="false" />

<add key="ClientValidationEnabled" value="true" />

<add key="UnobtrusiveJavaScriptEnabled" value="true" />

</appSettings>

先是设置webpages框架的版本webpages:Version,然后是设置webpages:Enabled防止webpages页面(cshtml )的直接执行。

ClientValidationEnabled和UnobtrusiveJavaScriptEnabled主要用于各htmlhelper方法,控制生成的客户端html代码,其中ClientValidationEnabled是指是否开启客户端验证,UnobtrusiveJavaScriptEnabled是指是否开启非侵入式JavaScript验证(通过给html元素添加元属性实现验证),这里不做过多深入。

<system.web>

<compilation debug="true" targetFramework="4.6" />

<httpRuntime targetFramework="4.6" />

</system.web>

System.web的设置目前很简单,只是设置了debug和.net版本。

再下面是封装每个程序集的绑定策略和程序集位置,每个程序集使一个dependentAssembly 元素。最后是指定可用语言提供程序的编译器配置设置。

此外还有默认生成的两个配置文件分别是用于Debug和Release模式的,根据配置的不同将对应的配置文件添加到最终生成的web.config中。

注册区域

再来查看默认生成的Global.asax文件,我们知道在第一次请求的时候该文件就已经被编译并会调用其中定义的Application_Start方法。

    protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

首先是注册所有的区域,其实现在AreaRegistration类中(在System.Web.Mvc下实现)。

    public static void RegisterAllAreas()
{
RegisterAllAreas(null);
} public static void RegisterAllAreas(object state)
{
RegisterAllAreas(RouteTable.Routes, new BuildManagerWrapper(), state);
} internal static void RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, object state)
{
List<Type> areaRegistrationTypes = TypeCacheUtil.GetFilteredTypesFromAssemblies(TypeCacheName, IsAreaRegistrationType, buildManager);
foreach (Type areaRegistrationType in areaRegistrationTypes)
{
AreaRegistration registration = (AreaRegistration)Activator.CreateInstance(areaRegistrationType);
registration.CreateContextAndRegister(routes, state);
}
}

其中TypeCacheUtil.GetFilteredTypesFromAssemblies会扫描所有相关程序集(BuildManager.GetReferencedAssemblies)获取实现了AreaRegistration的类(而且必须有可访问的无参的构造函数)。然后创建实例并调用CreateContextAndRegister注册区域。

    internal void CreateContextAndRegister(RouteCollection routes, object state)
{
AreaRegistrationContext context = new AreaRegistrationContext(AreaName, routes, state);
string thisNamespace = GetType().Namespace;
if (thisNamespace != null)
{
context.Namespaces.Add(thisNamespace + ".*");
}
RegisterArea(context);
}

  

其中具体的注册方法RegisterArea是一个虚方法,我们创建一个区域看看它是如何实现的,在MVC程序中通过右键创建一个名为Teacher的区域,自动生成的AreaRegistration代码如下:

    public class TeacherAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Teacher";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Teacher_default",
"Teacher/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}

可以看到最终是通过AreaRegistrationContext的MapRoute向RouteTable注册了路由。

    public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
if (namespaces == null && Namespaces != null)
{
namespaces = Namespaces.ToArray();
}
Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces);
route.DataTokens[RouteDataTokenKeys.Area] = AreaName;
bool useNamespaceFallback = (namespaces == null || namespaces.Length == );
route.DataTokens[RouteDataTokenKeys.UseNamespaceFallback] = useNamespaceFallback;
return route;
}

可以知道AreaName被注册到了route.DataTokens[RouteDataTokenKeys.Area]中。

过滤器、路由和资源

接下来看Global.asax的下面三行代码:

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

这是我们比较熟悉的注册全局过滤器、注册路由和注册绑定(主要是css和js资源)了。其实际工作有一下三个类完成。对于过滤器和路由的机制留到以后再详细分析,这里简单介绍一下资源绑定。

查看具体的代码

   bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js"));
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/site.css"));

我们可以看到两种绑定ScriptBundle(js脚本)和StyleBundle(css),值得注意的是StyleBundle方法的参数virtualPath需要根据绑定的css来设置(设置成css文件同目录,避免css中的一些相对路径失效),如果js脚本中有引用其他脚本也是一样。页面使用时直接通过Scripts或Styles的静态方法Render(paths)在页面中引用资源。

Asp.Net MVC-01-起步的更多相关文章

  1. MVC 01

    ASP.NET MVC 01 - ASP.NET概述 本篇目录: ASP.NET 概述 .NET Framework 与 ASP.NET ASP.NET MVC简介 ASP.NET的特色和优势 典型案 ...

  2. [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文

    我们在asp.net 开发中已经封装了最强大的HttpContext,我们可以在HttpContext中可以获取到几乎任何想获取的东西,也可以在HttpContext写入需要返回客户端的信息.但是这些 ...

  3. ASP.NET MVC 5 01 - ASP.NET概述

    本篇目录: ASP.NET 概述 .NET Framework 与 ASP.NET ASP.NET MVC简介 ASP.NET的特色和优势 典型案例 ▁▃▅ ASP.NET概述 ▅▃▁ 目前开发B/S ...

  4. [ASP.NET MVC 小牛之路]01 - 理解MVC模式

    本人博客已转移至:http://www.exblr.com/liam  PS:MVC出来很久了,工作上一直没机会用.出于兴趣,工作之余我将展开对MVC的深入学习,通过博文来记录所学所得,并希望能得到各 ...

  5. [ASP.NET MVC 大牛之路]01 - 开篇

    匆匆2014,转眼就到末尾了.在这一年,你还有哪事情些想做而没有做? 2014年在我身上发生了两件意义重大的事,一是正月初一宝宝出生,我升级成为了爸爸:二是进入了一家创业公司,成为了技术负责人. 去年 ...

  6. ASP.NET MVC 基础(01)

    [ASP.NET MVC ]系列文章大致会包含这样一些内容: 1.ASP.NET MVC 的一些高级知识点: 2.ASP.NET MVC 的一些最新技术: 3.ASP.NET MVC 网站安全方面的知 ...

  7. ASP.NET MVC:01理解MVC模式

    ASP.NET MVC是ASP.NET Web应用程序框架,以MVC模式为基础. MVC:Model View Controller 模型-视图-控制器Model(模型):负责对数据库的存取View( ...

  8. 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)

    过滤器 什么是过滤器? 过滤器(Filter) 主要的作用大致可以理解为把我们的附加逻辑注入到MVC框架的请求处理. 在ASP.NET MVC的请求处理中一种有19个管道事件分别是 BeginRequ ...

  9. 【ASP.NET MVC 学习笔记】- 01 理解MVC模式

    本文参考:http://www.cnblogs.com/willick/p/3195560.html 1.MVC模式是软件系统的一种架构模式,它将软件分为三大模块: 模型(Model):封装业务逻辑以 ...

  10. ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式、错误信息提示、validate方法的背后

    ASP.NET MVC借助jQuery的验证机制,提供了一套从客户端到服务端异步验证的解决方案,通常情况下,用起来相当方便.但面对一些相对特殊的情况,可能会遇到验证失效的场景,比如在使用ajax动态异 ...

随机推荐

  1. 前端架构之路:使用Vue.js开始第一个项目

    Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文通过一个简单的实例开始上手Vue.js开发.   一.技术准备 笔者建议在开始项目前,对以下两个技术点进行了解. ...

  2. html学习笔记 - sublime text 插件安装

    command + shift + p 呼出搜索界面 输入 Packge Control:Install Package 进入到插件搜索列表 Emmet -- >快速生成html标签结构 Emm ...

  3. 一个Monad的不严谨介绍

    一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?* 之前了解了下Monad,后来一段时间没碰,最近研究Parser用到Monad时发现又不懂了.现在重新折腾,趁着 ...

  4. Hibernate与Jpa的关系(2)

    [转自:http://blog.163.com/hero_213/blog/static/398912142010312024809/ ] 近年来ORM(Object-Relational Mappi ...

  5. R语言机器学习之caret包运用

    在大数据如火如荼的时候,机器学习无疑成为了炙手可热的工具,机器学习是计算机科学和统计学的交叉学科, 旨在通过收集和分析数据的基础上,建立一系列的算法,模型对实际问题进行预测或分类. R语言无疑为我们提 ...

  6. NetFramework各个版本的特性笔记

    公式记忆: .Net 2.0=CLR+BCL+C#(VB.Net)+Win Form+Web Form .Net 3.0=.Net 2.0+WCF+WPF+WF+WCS .Net 3.5=.Net 3 ...

  7. 【JAVAWEB学习笔记】网上商城实战3:购物模块和订单模块

    网上商城实战3 今日任务 完成购物模块的功能 完成订单模块的功能 1.1      购物模块: 1.1.1    功能演示: 商品详情: 购物车模块: 1.1.2    代码实现: 1.在商品详情的页 ...

  8. Java对【JSON数据的解析】--Gson解析法

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 两者异同点: 相同点:都是根据JSON数据创建相应的类 不同点: 1.调用方式区别 谷歌:方法都是非静态的,需要先创 ...

  9. 并发容器ConcurrentHashMap#put方法解析

    jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的Ha ...

  10. python之matplotlib绘图基础

    Python之matplotlib基础 matplotlib是Python优秀的数据可视化第三方库 matplotlib库的效果可参考 http://matplotlib.org/gallery.ht ...