你的位置:首页 > ASP.net教程

[ASP.net教程]ASP.NET MVC6启程(一)


ASP.NET MVC6已出炉多时,但现在很多项目都还在使用MVC4,所以MVC6还未到火的时候,但是从各大新闻报纸媒体上都能或多或少的知道它是能够跨平台的,这也就弥补的ASP.NET一直以来的缺憾,所以我也开始加入研究MVC6的阵营中来,这一研究忽然发现有很多似曾相识的地方,又有很多令人拍案叫好的地方。下面我就从我刚开始接触MVC6时所遇到的问题入手,记录一下MVC6的一些基础应用。

1、打开VS2015创建ASP.NET Web Application项目。

图1


然后选择“ASP.NET 5 Template”下的“Empty”模板。为什么不选右边的“Web Application”?原因很简单,学一样新东西得从无到有开始学,如果一开始就被IDE蒙蔽的双眼,后面还如何前进?

图2


项目创建完成之后,我们会看到如下打开的文件:

图3


我们先不管它们是什么意思,先运行一下看看是个什么效果:

图4


结果就是这个样子,那么这个“Hello World!”是在哪个地方定义的呢,很明显它是在图3的第27行定义的,只要我们把那个地方的字符串改掉,页面就会输出不同的内容。也就是说“Configure”方法会在我们程序启动的时候被调用,那么又是谁调用的它?图3的第32行就是我们想找的Main方法,它就是程序的入口,至于它内部的实现机制,就得深入源码去研究了,为了不至于一开始就产生挫败感,研究源码的事放后面再说,先实现一个简单的小应用,找点成就感。这里我们只需要知道它是用来启动我们的Web应用的就行了。

接下来我们来看看MVC6项目结构(左侧),我这里拿它跟MVC4的结构(右侧)对比一下:

图5


图6


我惊奇的发现,MVC6的项目似乎没有文件夹了,那么真的是这样么?其实我们可以点开“wwwroot”这个节点,里面就出现了我们熟悉的“web.config”文件,也就是说“wwwroot”就是网站的根目录,我们的一些静态资源文件(css、js、image等)都应该放在这个目录下。那么我们的“Controllers”文件夹和“Views”文件夹去哪儿了呢?没有嘛,那就自己建一个呗,这还不简单?于是我们就先建这两个文件夹放着:

图7


注意:这俩文件夹应该建在项目的最外层,而不应该建在“wwwroot”文件夹下面。也就是说这俩文件夹应该跟“wwwroot”处于同一级。

然后,我们就在“controllers”文件夹上右键,然后“Add”-“New Item”,在弹出的对话框中先选择左侧导航的“Server-side”表示选择“服务器端”的项,然后从右侧出现的列表中选择“MVC Controller Class”,然后输入controller的名字添加。

图8


添加完成之后,VS会自动打开刚创建的controller文件,结果是这样的:

图9


啊!为什么会出现红色波浪线!因为“Controller”类并没有被解析出来,换句话说,我们还没引用MVC的包。引用MVC的包有两种方式,看个人喜好用哪种:

第一种:通过项目根目录下的“project.json”文件添加。打开该文件,我们会看到json格式的数据,我们找到“dependencies”节点,这里面定义的就是项目依赖的包。我们在里面做如下新增:

图10


图11


所以,添加完之后,应该是下面这个样子:

"dependencies": {
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final"
}

第二种:通过包管理器。首先,在项目的“References”节点上右键,点击“Manage NuGet Packages...”,然后在右侧打开的选项卡的顶部选择“Browse”,然后在上面的搜索框中输入“mvc”,然后会发现很多列表,然后我们单击选择“Microsoft.AspNet.Mvc”这个项,与此同时右侧属性窗口会显示出可用的版本,当我们选择版本之后,点击右边的“Install”按钮安装即可。

图20


安装完之后,我们再来看看controller文件有没有被解析到:

图12


我们发现已经被很好的解析了,接下来我们像MVC4中创建视图一样,创建一个视图。如下:

图13


然后我们迫不及待的想跑一下,结果得到的是这个结果:

图14


为啥还是“Hello World!”,我的“OK”呢?有人可能觉得是我没把地址打完整,好,我打完整看看:

图15


结果还是这个,这是为什么呢?我们看下面这段代码:

app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});

我们这几次的输出都是由它在进行,那么它是什么?复杂的我先不说,现在我们就可以把它理解成一个实现“IHttpAsyncHandler”接口的实例,里面那个委托就是“ProcessRequest(HttpContext context)”方法,这下是不是稍微有些明白了?那么“app.Run(...)”又是做什么的呢?我们可以简单通过智能提示了解一下:

图16


智能提示说,这个方法,添加一个终端中间件处理委托到应用程序的请求管道里面。这是啥意思呢?我们可以用下面这个图来简单说明一下:

图17


所以如果不在IIS跟终端中间件之间拦截一下的话,输出始终都会是“Hello World!”。那么,我们该如何拦截呢?

我们可以在它之前再添加一个终端中间件:

app.Run(async context =>
{
await Task.Run(() => { });
});

app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});

这样一来,就啥也不会输出了。但是,这样做毫无意义,我们该如何把MVC的中间件添加上去呢?很简单,我们只需在前面添加如下代码,就能把MVC中间件给加上了。里面的路由参数我就不多说了,用过MVC4的应该都知道。

app.UseMvc(route =>
{
route.MapRoute(
name: "default",
template: "{controller}/{action}",
defaults: new { controller = "home", action = "index" }
);
});

接下来,我们再跑一下看看是不是成功了:

图18


报错了,说找不到服务,要通过IServiceCollection.AddMvc()添加服务,于是我们在Startup.cs文件里面找找,结果确实有个配置IServiceCollection的地方,然后我们把MVC服务添加进去,如下:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}

好,然后Rebuild刷新页面:

图19


结果发现OK了。有没有小小的激动一把,至于services.AddMvc()和app.UseMvc(...)之间到底是怎样的关系,以及布局页的使用,和数据访问我下次再写咯。