.NET CORE 1.0, MVC6 & ANGULARJS2 - 入门






4.90/5 (29投票s)
在本文中,我们将探讨 .Net Core,了解如何使用 MVC6 和 AngularJS2,以及如何使用 Node 包管理器 (NPM) 管理客户端依赖项。
目录
- 设置环境
- ASP.Net 概述
- 开始使用 .Net Core 1.0。
- 探索初始模板 (Empty)
- 如何添加 MVC6
- AngularJS2- 管理客户端依赖项
- 使用包管理器 (NPM)。
- 使用任务运行器
- 使用 Type Script 进行引导
 
- 构建并运行应用程序
1. 设置环境
先决条件:需要以下先决条件。
- Visual Studio 2015
- ASP.NET Core 1.0
Visual Studio 2015:如果您已安装 Visual Studio 2015,则可以使用 Update 3 更新 Visual Studio 2015。
或者
免费下载 Visual Studio Community 2015。
.NET Core 下载:
您可以下载以下之一
- .NET Core SDK (软件开发工具包/命令行接口) 工具
- .NET Core 1.0.0 - VS 2015 Tooling Preview 2 (运行具有 .NET Core 运行时的应用程序)
我们已经准备就绪。在深入探讨我们的主题之前,让我们先回顾一下 ASP.Net。
2. ASP.Net 概述
让我们区分两者。
.Net Framework
- 仅在 Windows 平台开发和运行。
- 基于 .NET Framework 运行时构建。
- 支持 (MVC、Web API 和 SignalR) 依赖项注入 (DI)。
- MVC 和 Web Api 控制器是分开的。
.Net Core
- 开源。
- 在跨平台开发和运行。
- 基于 .NET Core 运行时以及 .NET Framework 构建。
- 动态编译功能。
- 内置依赖项注入 (DI)。
- MVC 和 Web Api 控制器统一,继承自同一个基类。
- 智能工具 (Bower、NPM、Grunt 和 Gulp)。
- 命令行工具。
3. 开始使用 .Net Core 1.0
让我们使用 Visual Studio 2015 > File > New > Project 创建一个新项目
选择 Empty 模板,然后单击 > OK。
Visual Studio 将创建一个新的 ASP.Net Core 空项目。

现在我们将逐一探索所有初始文件。
4. 探索初始模板
在解决方案资源管理器中标记的部分将逐一探索。

首先,我们了解 program.cs 文件。好的,让我们专注于它。
Program.cs:这里有一段示例代码,让我们来解释一下。
namespace CoreMVCAngular
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
            host.Run();
        }
    }
}
.UseKestrel():定义 Web 服务器。ASP.NET Core 支持在 IIS 和 IIS Express 中托管。
HTTP 服务器
- Microsoft.AspNetCore.Server.Kestrel (跨平台)
- Microsoft.AspNetCore.Server.WebListener (仅限 Windows)
.UseContentRoot(Directory.GetCurrentDirectory()):应用程序根目录,指定应用程序根目录的路径。
.UseIISIntegration():用于在 IIS 和 IIS Express 中托管。
.UseStartup<Startup>():指定 Startup 类。
.Build():构建将托管应用程序并管理传入 HTTP 请求的 IWebHost。
Startup.cs:这是每个 .Net Core 应用程序的入口点,提供应用程序所需的各种服务。
namespace CoreMVCAngular
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            
        }
    }
}
如您所见,有两个方法:ConfigureServices 和 Configure。在 Configure 方法中,指定了三个参数。
IApplicationBuilder 定义了一个提供配置应用程序请求机制的类。
我们可以通过使用“Use”扩展方法将 MVC (中间件) 添加到请求管道,稍后我们将使用它。
ConfigureServices 是一个公共方法,用于配置使用各种服务。
Project.json:这是列出应用程序依赖项(名称和版本)的地方。此文件还管理运行时和编译设置。
Dependencies:所有应用程序依赖项都在这里,如果需要,我们可以添加新的依赖项,Intellisense 将帮助我们包含名称和版本。

保存更改后,它将自动从 NuGET 还原依赖项。

这是我更改的代码片段。
"dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.0"
  },
要卸载,请转到解决方案资源管理器 > 右键单击包 > 卸载包

Tools:此部分管理和列出命令行工具,我们可以看到默认添加了 IISIntegration.Tools,这是一个包含 dotnet publish iis 命令用于将应用程序发布到 IIS 的工具。
"tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },
Frameworks:正如我们所见,最初我们的应用程序默认运行在 .NET Core 平台上,具有运行时 Code
"frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },
Build Options:在构建应用程序时传递给编译器的选项。
"buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },
RuntimeOptions:在应用程序运行时管理服务器垃圾回收。
"runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },
PublishOptions:这定义了在发布应用程序时要包含/排除到输出文件夹或从输出文件夹排除的文件/文件夹。
"publishOptions": {
    "include": [
      "wwwroot",
      "web.config"
    ]
  },
Scripts:Scripts 是对象类型,指定在构建或发布应用程序期间要运行的脚本。
"scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
5. 添加 MVC6
现在是时候添加 MVC6 了。在 .NET Core 1.0 中,MVC 和 Webapi 已统一,成为一个类,继承自同一个基类。
让我们向应用程序添加 MVC 服务。打开 project.json 以在其中添加新依赖项。在 dependencies 部分添加两个依赖项。
"Microsoft.AspNetCore.Mvc": "1.0.0",
"Microsoft.AspNetCore.StaticFiles": "1.0.0" //Serving static file
单击“保存”。

它将开始自动还原包。

现在,让我们在 startup 类的 Config 方法中将 MVC (中间件) 添加到请求管道。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole();
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    //app.UseStaticFiles();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}
在 ConfigureServices 方法中,我们需要添加框架服务。我们已添加 services.AddMvc();
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
}
MVC 文件夹结构:
让我们向我们的示例应用程序添加 MVC 文件夹结构。我们已将视图文件添加到 views 文件夹,并将 MVC 控制器添加到 Controllers 文件夹,就像旧的 MVC 应用程序一样。

您可能会注意到 views 文件夹中有一个新文件 "_ViewImports.cshtml",该文件负责设置项目中视图可以访问的命名空间,这以前是在 views 文件夹中的 web.config 文件中完成的。
我们几乎完成了。让我们修改视图内容以显示欢迎消息。现在运行应用程序,您可以看到欢迎消息显示在主页上。

输出

6. AngularJS2
AngularJS2 是一个现代的客户端 JavaScript 框架,用于应用程序开发。这个 JavaScript 框架是全新的,并且基于 TypeScript 编写。
我们将按照以下步骤学习如何将其安装到我们的应用程序中
- 管理客户端依赖项
- 使用包管理器 (NPM)。
- 使用任务运行器
- 使用 Type Script 进行引导
客户端依赖项:我们需要为 Node 包管理器 (NPM) 添加一个 json 配置文件。单击 Add > New Item > Client- Side > npm Configuration File,然后单击 OK。

打开我们新添加的 npm 配置文件并修改初始设置。
{
  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "Dependencies": {
    "angular2": "2.0.0-beta.9",
    "systemjs": "0.19.24",
    "es6-shim": "^0.33.3",
    "rxjs": "5.0.0-beta.2"
  },
  "devDependencies": {
    "gulp": "3.8.11",
    "gulp-concat": "2.5.2",
    "gulp-cssmin": "0.1.7",
    "gulp-uglify": "1.2.0",
    "rimraf": "2.2.8"
  }
}
在 dependencies 部分,我们需要添加 AngularJS2 以及其他依赖项,它们的作用是:
- Es6-shim:这是一个库,在旧环境中提供兼容性。
- Rxjs:以各种格式提供更模块化的文件结构。
- SystemJS:允许直接导入 System.import TypeScript 文件。
正如您所见,有两种不同的对象类型:一种是用于生产目的的 dependencies,另一种是用于开发相关的 devDependencies,例如 gulp 用于运行不同的任务。
单击保存,它将自动还原。在这里,我们在 Dependencies 部分拥有所有必需的包。

在此应用程序中,我们添加了另一个包管理器 Bower,单击 Add > New Item > Client- Side > Bower Configuration File,然后单击 OK。

与 NPM 相比,
鲍尔
- 管理 html、css、js 组件
- 加载最少的资源
- 使用扁平化依赖项加载
NPM
- 递归安装依赖项
- 加载嵌套依赖项
- 管理 NodeJS 模块
打开配置文件,然后在 dependencies 部分添加所需的依赖项及特定版本。

编辑后保存 JSON 文件,它将自动在我们的项目中还原该包。在这里,您可以看到我们通过 Bower 包管理器添加了 Jquery 和 Bootstrap 包。

现在,让我们添加一个 gulp 配置文件来运行任务。单击 Add > New Item > Client- Side,然后选择 gulp json 文件进行包含。

Gulp.json
/*
This file in the main entry point for defining Gulp tasks and using Gulp plugins.
Click here to learn more. http://go.microsoft.com/fwlink/?LinkId=518007
*/
"use strict";
var gulp = require("gulp");
var root_path = { webroot: "./wwwroot/" };
//library source
root_path.nmSrc = "./node_modules/";
//library destination
root_path.package_lib = root_path.webroot + "lib-npm/";
gulp.task("copy-systemjs", function () {
    return gulp.src(root_path.nmSrc + '/systemjs/dist/**/*.*', {
        base: root_path.nmSrc + '/systemjs/dist/'
    }).pipe(gulp.dest(root_path.package_lib + '/systemjs/'));
});
gulp.task("copy-angular2", function () {
    return gulp.src(root_path.nmSrc + '/angular2/bundles/**/*.js', {
        base: root_path.nmSrc + '/angular2/bundles/'
    }).pipe(gulp.dest(root_path.package_lib + '/angular2/'));
});
gulp.task("copy-es6-shim", function () {
    return gulp.src(root_path.nmSrc + '/es6-shim/es6-sh*', {
        base: root_path.nmSrc + '/es6-shim/'
    }).pipe(gulp.dest(root_path.package_lib + '/es6-shim/'));
});
gulp.task("copy-rxjs", function () {
    return gulp.src(root_path.nmSrc + '/rxjs/bundles/*.*', {
        base: root_path.nmSrc + '/rxjs/bundles/'
    }).pipe(gulp.dest(root_path.package_lib + '/rxjs/'));
});
gulp.task("copy-all", ["copy-rxjs", 'copy-angular2', 'copy-systemjs', 'copy-es6-shim']);
要运行任务,请右键单击 Gulp.json 文件,然后选择 reload。

右键单击 copy-all,然后单击 Run。

任务已运行并完成,正如您所见。

在解决方案资源管理器中,所有必需的包都已复制。我们还需要放置 es6-shim 的类型定义 (typing 文件夹),否则会报“Cannot find name 'Promise'”的错误。

使用 TypeScript 进行引导
Tsconfig.json
{
  "compilerOptions": {
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    //add this to compile app component
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "module": "system",
    "moduleResolution": "node"
  },
  "exclude": [
    "node_modules",
    "wwwroot/lib"
  ]
}
noImplicitAny:当表达式和声明具有隐含的 'any' 类型时,引发错误。
noEmitOnError:如果报告了任何错误,则不发出输出。
Target:指定 ECMAScript 目标版本:“es5” (默认)、“es5” 或“es6”。
experimentalDecorators:启用 ES7 装饰器的实验性支持。
在此处获取有关编译器选项的更多详细信息:here。
在 wwwroot 文件夹中为 .ts 文件创建一个 app 文件夹。

在解决方案资源管理器中,您可以按如下方式添加文件。

在 main.ts 中,代码片段通过导入组件来引导 AngularJS。
import {bootstrap}    from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {enableProdMode} from 'angular2/core';
enableProdMode();
bootstrap(AppComponent);
Component:从 Angular 2 库导入 Component 函数,“export”的使用意味着 app component 类可以从其他组件导入。
import {Component} from 'angular2/core';
@Component({
    selector: 'core-app',
    template: '<h3>Welcome to .NET Core 1.0 + MVC6 + Angular 2</h3>'
})
export class AppComponent { }
MVC 视图:现在是时候更新我们的布局并链接库了。

现在我们将向 布局页面 添加引用。
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    <script src="~/lib-npm/es6-shim/es6-shim.js"></script>
    <script src="~/lib-npm/angular2/angular2-polyfills.js"></script>
    <script src="~/lib-npm/systemjs/system.src.js"></script>
    <script src="~/lib-npm/rxjs/Rx.js"></script>
    <script src="~/lib-npm/angular2/angular2.js"></script>
</head>
<body>
    <div>
        @RenderBody()
    </div>
    @RenderSection("scripts", required: false)
</body>
</html>
Index.cshtml
@{
    ViewData["Title"] = "Home Page";
}
<core-app>
    <div>
        <p><img src="~/img/ajax_small.gif" />  Please wait ...</p>
    </div>
</core-app>
@section Scripts {
    <script>
        System.config({ packages: { 'app': { defaultExtension: 'js' } }, });
        System.import('app/main').then(null, console.error.bind(console));
    </script>
}
还有一件事要做是启用静态文件服务。将此行添加到 startup 配置方法中。
app.UseStaticFiles();
7. 构建并运行应用程序
最后构建并运行应用程序

在这里,我们可以看到我们的应用程序正在使用 AngularJS2 工作

希望这对您有所帮助 :)



