这篇文章是从我的 github 博客 http://lxconan.github.io 导入的。

如果你想用 ASP.NET MVC 创建一个网络应用,那么你可以搜到很多的文章。但是没有多少文章告诉你,如何从零开始创建一个 ASP.NET MVC 应用程序。这对我们是非常有害的,我们希望了解每一个细节,搞清 Components 之间的联系。然后,再放心的使用向导创建 ASP.NET MVC 应用程序。需要表明一点的是,我说的从零开始,是从零开始一步一步创建 App,我希望你应该熟悉 C#,并至少对 ASP.NET MVC 多多少少有些了解。

我们将使用 ASP.NET MVC 5,因此请至少准备好一个支持 .NET 4.5 的 Visual Studio 版本(2012 或者 2013)。如果没有银子购买专业版或者以上版本,那么用免费的 Express 版本也是不错的。

首先我们要创建一个空白的 Web Application。打开 visual studio 并创建一个空白的 Web Application。为了照顾新同学我大发善心的告诉你,应该选择 ASP.NET Empty Web Application。微软会非常友好的添加一大堆你可能一辈子都用不着的程序集引用。因此我们第一件事儿就是删掉他们。删到如下程度为止:

Solution
|-Homework.App
|-Properties
| |-AssemblyInfo.cs
|-References
| |-System
| |-System.Core
|-Web.config

安装 ASP.NET MVC 5 Packages

在前几个 ASP.NET MVC 版本的时候,你需要从官方网站上下个包,然后点 Setup 然后……总之一切都显得有点儿不专业,好在现在不用了。打开 nuget manager ,安装 Microsoft ASP.NET MVC,或者在 package management console 里面输入:

Install-Package Microsoft.AspNet.Mvc -Version 5.0.0

这个 package 会安装以下三个依赖包:Microsoft ASP.NET RazorMicrosoft ASP.NET Web Pages 以及 Microsoft Web Infrastructure。以下的东西不用记,如果有兴趣,你可以当看小说似的看一下:

  • 其中第一个包是 ASP.NET MVC 的 Razor 的语言解析器,用于将 .cshtml 的服务端页面解析为抽象语法树,并提供编辑器支持。
  • 第二个包,也就是 ASP.NET Web Pages,提供了 ASP.NET MVC 服务端页面编辑需要的各种辅助工具。
    • 例如,防止 XSS 和 CSRF 攻击的辅助类型(参见 System.Web.HelpersSystem.Web.Helpers.AntiXsrf 名字空间)
    • Model 的客户端验证类型(就是类似“必须填写”,“必须在xxx范围之内”这种东西,当然,我对这些东西不抱有好感),以及最基本的 HTML 元素输出的支持(TagBuilder,这可是个好同志,如果你不用他书写自己的 HtmlHelper 扩展方法,而是还在用 string.Format()输出 HTML,那么,快去改掉那些该死的代码)。这些都在 System.Web.Mvc 名字空间里。
    • 服务端页面的基本类型:WebPageBase。你可能惊讶的发现了一个名为 WebPage 的类型,并且里面还有 ModelLayout 等你耳熟能详的属性,你兴奋的以为你找到了组织但是我只能告诉你你搞错了。这个 WebPage 真的是一坨 Rubbish。真正的 ASP.NET MVC WebPage 在 System.Web.Mvc.WebViewPage 里,这是一个为了向下兼容而遗留下来的历史问题。
    • Razor 服务端页面的编译逻辑(在 System.Web.WebPages.Razor里)。
    • 一些好用的和过时了的页面辅助类型(请看 System.Web.Helpers)。这里加入我的个人吐槽,如果你以后创建了一个 Framework,那么千万不要把辅助类加到你的 Framework 的包中,而是当作一个附加的包供大家自由下载使用。否则为了向后兼容性你不得不让这些丑陋的设计一直存在下去,并被持续吐槽。
  • 第三个包,也就是 Microsoft Web Infrastructure 提供了 ASP.NET 的基础架构——才怪!里面充斥了对反射功能的封装(服务端页面需要这些特性)和系统环境的检查(例如注册表)。总之,加上它,ASP.NET MVC 需要它,但是我们不会使用它。

安装好以后我们的工程看起来貌似有些料了:

Solution
|-Homework.App
|-Properties
| |-AssemblyInfo.cs
|-References
| |-Microsoft.Web.Infrastructure
| |-System
| |-System.Core
| |-System.Web.Helpers
| |-System.Web.Mvc
| |-System.Web.Razor
| |-System.Web.WebPages
| |-System.Web.WebPages.Deployment
| |-System.Web.WebPages.Razor
|-Web.config

创建基本工程结构

Convension over configuration 是目前大家偏好的设计形式,Rails 在这方面非常典型,其他的 MVC Framework 也在这样做。那么我们就按照这种约定创建工程结构吧。

  • 首先我们需要一个 Controllers 名字空间来存放(默认 Area,我们以后会涉及 Area 这个概念) 下面的 Controllers 类型;
  • 另外我们需要一个 Views 文件夹来存放服务端页面。

像这样:

Solution
|-Homework.App
|-Properties
| |-AssemblyInfo.cs
|-References
| |-Microsoft.Web.Infrastructure
| |-System
| |-System.Core
| |-System.Web.Helpers
| |-System.Web.Mvc
| |-System.Web.Razor
| |-System.Web.WebPages
| |-System.Web.WebPages.Deployment
| |-System.Web.WebPages.Razor
|-Controllers
|-Views
|-Web.config

Hello World

看标题你就知道激动人心的时刻即将来临了。让我们开始最后的冲刺吧。我们要添加一个 HomeController,然后添加一个 View,View 上书写着不变的咒语:Hello World。

这个过程网络上的文章多如牛毛,我就简述了,总之你应该得到如下的工程结构:

Solution
|-Homework.App
|-Properties
| |-AssemblyInfo.cs
|-References
| |-Microsoft.Web.Infrastructure
| |-System
| |-System.Core
| |-System.Web.Helpers
| |-System.Web.Mvc
| |-System.Web.Razor
| |-System.Web.WebPages
| |-System.Web.WebPages.Deployment
| |-System.Web.WebPages.Razor
|-Controllers
| |-HomeController.cs
|-Views
| |-Home
| |-Index.cshtml
|-Global.asax
| |-Global.asax.cs
|-Web.config

以上的内容我认为唯一可能出问题的就是如何创建 Global.asax 文件,单击右键,选择创建 Glboal Application Class 就可以了。

下面我们简单过一下新添加的文件的内容。其中,Index.cshtml 中的内容应该是类似这样的:

@inherits System.Web.Mvc.WebViewPage

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<title>Index</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>

这里我们有必要解释几句。第一行,也就是 @inherits System.Web.Mvc.WebViewPage 这句话描述了当前页面的类型是 System.Web.Mvc.WebViewPage。我们之前说到了,所有的 ASP.NET MVC 页面的基础类型是 WebPage,而 WebViewPageWebPage 的一个派生类,他提供了 MVC 的页面需要的所有方法和属性,例如 Model 属性,Html 属性,Layout 属性。

第二行,也就是 @{ Layout = null; } 这一行,说明了我们这个服务端页面的所有布局信息都在这里,没有母板页的影响。关于 Layout我们后续文章会有涉及。

接下来我们看看 HomeController,它里面的内容是这样的。

using System.Web.Mvc;

namespace Homework.App.Controllers
{
[RoutePrefix("home")]
public class HomeController : Controller
{
[Route("")]
public ActionResult Index()
{
return View();
}
}
}

HomeController 类中仅仅包含一个 GET 方法 Index() 他直接返回了 View() 这样,ASP.NET MVC 将依据 Home/Index.cshtml 的内容生成页面并返回给客户端。

哦,我敢肯定你发现了什么不同:[RoutePrefix][Route] 是个什么东西,原来的 Route 不是需要用 RouteCollection.MapRoute() 方法注册吗?漂亮!这是 ASP.NET MVC 5 提供的新特性(从 sinatra 抄过来的,不过我一点没有鄙夷的意思,因为 ASP.NET MVC 在不断的改进。大家一直都在互相抄,当一个新的语言或者 Framework 形成的时候,大家做的第一件事情就是把我们在其他语言和 Framework 上做的工作完完整整的重新抄一遍)。

问题是,原来我们需要在 Web 应用程序启动的时候使用 RouteTable.Routes.MapRoute() 指定路由的模版,那么现在要怎么做呢?请打开 Global.asax.cs 文件,删掉那些不用的方法,只留下如下的内容。

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace Homework.App
{
public class Global : HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapMvcAttributeRoutes();
}
}
}

Application_Start 方法会在应用程序启动的时候调用,而其中的 RouteTable.Routes.MapMvcAttributeRoutes(); 就是在声明我们将使用 Attribute 进行路由的解析。

你是否迫不及待的按下了 Ctrl + F5 并且看到了期待已久的 Hello World?恭喜你!在下一节中我们将讨论一些 web.config 的配置的问题。

ASP.NET MVC 从零开始 - create and run的更多相关文章

  1. ASP.NET MVC 从零开始 - 自动化部署(其二)

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...

  2. ASP.NET MVC 从零开始 - 请求处理

    这篇文章是从我的 github 博客 lxconan.github.io 导入的. 这是这个系列的第三篇了.前两篇文章请参见: ASP.NET MVC 从零开始 - Create and Run AS ...

  3. ASP.NET MVC 从零开始 - 自动化部署(其一)

    本文是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第四篇了,前三篇请参见: ASP.NET MVC 从零开始 – Create and Run ...

  4. ASP.NET MVC 从零开始 - Web.config

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 在上一篇中,我们从零开始创建了一个非常简单的 ASP.NET MVC 应用程序.接下来,你是不是期望我 ...

  5. 【转】ASP.NET MVC 的最佳实践

    [This post is based on a document authored by Ben Grover (a senior developer at Microsoft). It is ou ...

  6. [转]ASP.NET MVC 2: Model Validation

    本文转自:http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx?CommentPo ...

  7. ASP.NET MVC 后台接收集合参数和 jquery ajax 传值

    MVC 接收参数数组(集合)   示例样本:   public class Person {      public string FirstName { get; set; }      publi ...

  8. 从零开始学习ASP.NET MVC 1.0

    转自:http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html <从零开始学习ASP.NET MVC 1.0& ...

  9. 系列文章--从零开始学习ASP.NET MVC 1.0

    从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件 从零开始学习 ASP.NET MVC 1.0 ...

随机推荐

  1. UWP Composition API - PullToRefresh

    背景: 之前用ScrollViewer 来做过 PullToRefresh的控件,在项目一些特殊的条件下总有一些问题,比如ScrollViewer不会及时到达指定位置.于是便有了使用Compositi ...

  2. conda安装包

    前面讲了有关conda改变镜像提高安装速度,这里来解决很多实用C写的酷,在Windows下不好安装的解决方案 1. 寻找wheel预编译文件 没有的话 2.使用conda命令安装 没有该包的话 3.实 ...

  3. Chrome 中的彩蛋,一款小游戏,你知道吗?

    今天看到一篇文章,介绍chrome中的彩蛋,带着好奇心进去看了一眼,没想到发现了一款小游戏,个人觉得还不错,偶尔可以玩一下,放松放松心情!^_^ 当 Chrome 无法连接到互联网时, 或者上着网突然 ...

  4. Python爬虫学习(11):Beautiful Soup的使用

    之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...

  5. Java对象大小计算

    这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机 ...

  6. java中注解的使用与实例(一)

    注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁. 注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致.Java S ...

  7. [译]App Framework 2.1 (2)之 Get Involved

    App Framework  API 第二篇 原文在此:http://app-framework-software.intel.com/documentation.php#intro/involved ...

  8. API,框架,组件

    API 是什么,API 就是通过提供方便使用的接口来执行它实现的功能. 用一个手电筒来作比喻: 手电筒的按钮就是接口,按下按钮就是它的方便的使用方式,发光就是它的功能,在这里我们可以称这个手电筒是个 ...

  9. 关于C#调用非托管动态库方式的性能疑问

    最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...

  10. Learning Play! 2.4

    1) Activator Download typesafe-activator-1.3.5.zip, extract, set path 2) Create new project activato ...