ASP.NET Core 1.0 RC2 And Angular2 Using WEB API

 

Introduction

In this article we will see in detail about using Angular2 with ASP.NET Core 1.0 RC2 using WEB API.

In our previous article Getting Started With ASP.NET Core 1.0 RC2 And Angular2 we have seen a few basics of Angular2 using ASP.NET Core RC2; now we will see in detail about using WEB API and Angular2 in ASP.NET Core RC2.

In this article we will see in detail how to,

  • Create our ASP.NET Core 1.0 RC2 Web Application.
  • Create MVC Model to add Student details.
  • Create MVC Controller to return WEB API Method
  • How to add TypeScript JSON Configuration File
  • How to add grunt package using NPM configuration file
  • How to configure Grunt File.
  • Adding Dependencies to install Angular2 and all other files
  • How to create our Angular2 App, boot using Type Script file.
  • Creating HTML File
  • How to Run the Grunt file using Visual Studio Task Runner Explorer
  • Run and view our Sample. 
Reference website

Prerequisites

Visual Studio 2015: You can download it from here.

ASP.NET Core 1.0 RC2: download link https://www.microsoft.com/net

https://www.microsoft.com/net/core#windows

Code Part

Step 1: Create our ASP.NET Core 1.0 Web Application.

After installing both Visual Studio 2015 and ASP.NET Core 1.0 RC2 click Start, then Programs, and select Visual Studio 2015 - Click Visual Studio 2015. Click New, then Project, select Web and select ASP.NET Core Web Application. Enter your Project Name and click OK.



Next select Web Application. If you are not hosting in the Cloud then you can uncheck the Host in the Cloud at the bottom right corner. Click OK.



Now we have,

 
Step 2: Creating MVC Model to return student list

We can create a model by adding a new class file in our Model Folder.



Right click the Models folder and click new Item. Select Class and enter your class name as “StudentMasters.cs”,



Now in this class we first create property variable, add student details to list, and return the list. We will be using this list in our controller.
 
  1. public class StudentMasters  
  2.     {  
  3.         public int StdID { getset; }  
  4.         public string StdName { getset; }  
  5.         public string Email { getset; }  
  6.         public string Phone { getset; }  
  7.         public string Address { getset; }  
  8.   
  9.   
  10.         public StudentMasters(int ID, string Name, string email, string phone, string Addr)  
  11.         {  
  12.             StdID = ID;  
  13.        StdName = Name;  
  14.        Email = email;  
  15.         Phone = phone;  
  16.             Address = Addr;  
  17.     }  
  18.   
  19.         public static List<StudentMasters> studetndDetails()  
  20.         {  
  21.             List<StudentMasters> listStudents = new List<StudentMasters>();  
  22.             listStudents.Add(new StudentMasters(1, "Shanu",  "shanu@shanumail.com",  "000000",  "korea"));  
  23.             listStudents.Add(new StudentMasters(2, "Afraz""Afraz@gmail.com""0000123""korea"));  
  24.             listStudents.Add(new StudentMasters(3, "Afreen""Afreen@gmail.com""000643""Seoul,Korea"));  
  25.             listStudents.Add(new StudentMasters(4, "Asha""Asha@gmail.com""00003455""Madurai,India"));  
  26.             listStudents.Add(new StudentMasters(5, "Kather""Kather@gmail.com""000067567656""Madurai,India"));  
  27.   
  28.             return listStudents;  
  29.         }  
  30.     }  
Step 3: Creating MVC Controller to return WEB API Method

We can create a controller by adding a new Empty API Controller in our Controller Folder.



Right click the Controller folder and Add Controller. Select Empty API Controller and give the name as “
StudentMastersController”,



In the controller we return the List result as
IEnumerable in our Angular2 Component we will be using this web API method to return the data and bind it in our HTML page. 
  1. [Produces("application/json")]  
  2.     [Route("api/StudentMasters")]  
  3.     public class StudentMastersController : Controller  
  4.     {  
  5.   
  6.         [HttpGet]  
  7.         public IEnumerable<StudentMasters> Get()  
  8.         {  
  9.             return StudentMasters.studetndDetails().ToList();  
  10.         }  
  11.     }  
To test it we can run our project and copy the get method API path -- here we can see our API path for get is api/StudentMasters/.Run the program and paste the above API path to test our output.



Step 4: How to add TypeScript JSON Configuration File

The TypeScript JSON file will specify the root files and the compiler options required to compile the project .To know more about TypeScript JSON Configuration kindly visit this site

http://www.typescriptlang.org/docs/handbook/tsconfig-json.html ,

To create the TypeScript JSON file right click on your Project and Click Add new Item.



Select TypeScript JSCON Configuration File and Click ok. The File will look like below image.



Now copy the below code and replace with your config file.
  1. "compilerOptions": {  
  2.     "emitDecoratorMetadata"true,  
  3.     "experimentalDecorators"true,  
  4.     "module""commonjs",  
  5.     "moduleResolution""node",  
  6.     "noImplicitAny"false,  
  7.     "noEmitOnError"true,  
  8.     "removeComments"false,  
  9.     "target""es5",  
  10.  "sourceMap"true  


Step 5: How to add grunt package using NPM configuration file

Now we need to add a NPM Configuration File for adding a grunt package to run our java scripts.

As we have created a Web Application the NPM Configuration File will be located in our project.

By default we can’t view our NPM Configuration File. The NPM Configuration File will be in the name of “package.JSON” . To view that from the Solution Explorer click on “Show All Files”

Now open the “package.JSON” file .Now first we need to change the name to our project Solution name and add our grunt package. We can see the code here below the image.



Here we have changed the name as our Solution name and also added the grunt package.

  1. {  
  2.   "name""test",  
  3.   "version""0.0.0",  
  4.   "private"true,  
  5. "devDependencies": {  
  6.     "grunt""1.0.1",  
  7.     "grunt-contrib-copy""1.0.0",  
  8.     "grunt-contrib-uglify""1.0.1",  
  9.     "grunt-contrib-watch""1.0.0",  
  10.     "grunt-ts""5.5.1",  
  11.     "gulp""3.8.11",  
  12.     "gulp-concat""2.5.2",  
  13.     "gulp-cssmin""0.1.7",  
  14.     "gulp-uglify""1.2.0",  
  15.     "rimraf""2.2.8"  
  16.   }  
  17. }  
Now save the package.json file and you should be able to see a grunt package. Under Dependencies/ the npm Folder will be first Resorted and then installed.

Restoring



All Installed



Step 6:
Configure Grunt File
 

Grunt is used to build all our client side resources like JavaScript for our project.

First step is to add a Grunt file to our project. Right click our project and Select Grunt Configuration File and click Add.



After creating the file now we need to edit this file to load plugins, configure plugins and define tasks, 
Here in our Grunt file we have first loaded plugins which we have added in our npm. Using loadNpmTask here we load 'grunt-contrib-copy ,'grunt-contrib-uglify' , 'grunt-contrib-watch',



Next we configure the grunt add the app.js file in our wwwroot folder. All our Script files from Scripts folder results will be added in this app.js file. Next we need to copy all the Script files from 'node_modules/ to our local js Folder.

The watch plugin will be used to check for any changes on the JavaScript file and update app.js with all new changes. 

  1. /* 
  2. This file in the main entry point for defining grunt tasks and using grunt plugins. 
  3. Click here to learn more. http://go.microsoft.com/fwlink/?LinkID=513275&clcid=0x409 
  4. */  
  5. module.exports = function (grunt) {  
  6.     grunt.loadNpmTasks('grunt-contrib-copy');  
  7.     grunt.loadNpmTasks('grunt-contrib-uglify');  
  8.     grunt.loadNpmTasks('grunt-contrib-watch');  
  9.     grunt.loadNpmTasks('grunt-ts');  
  10.     grunt.initConfig({  
  11.         ts:  
  12.         {  
  13.             base:  
  14.             {  
  15.                 src: ['Scripts/app/boot.ts''Scripts/app/**/*.ts'],  
  16.                 outDir: 'wwwroot/app',  
  17.                 tsconfig: './tsconfig.json'  
  18.             }  
  19.         },  
  20.         uglify:  
  21.         {  
  22.             my_target:  
  23.             {  
  24.                 files: [{  
  25.                     expand: true,  
  26.                     cwd: 'wwwroot/app',  
  27.                     src: ['**/*.js'],  
  28.                     dest: 'wwwroot/app'  
  29.                 }]  
  30.             },  
  31.             options:  
  32.             {  
  33.                 sourceMap: true  
  34.             }  
  35.         },  
  36.         // Copy all JS files from external libraries and required NPM packages to wwwroot/js    
  37.         copy: {  
  38.             main: {  
  39.                 files:  
  40.                      [{  
  41.                          expand: true,  
  42.                          flatten: true,  
  43.                          src: ['Scripts/js/**/*.js''node_modules/es6-shim/es6-shim.min.js''node_modules/systemjs/dist/system-polyfills.js''node_modules/angular2/bundles/angular2-polyfills.js''node_modules/systemjs/dist/system.src.js''node_modules/rxjs/bundles/Rx.js''node_modules/angular2/bundles/angular2.dev.js'],  
  44.                          dest: 'wwwroot/js/',  
  45.                          filter: 'isFile'  
  46.                      }]  
  47.             }  
  48.         },  
  49.         // Watch specified files and define what to do upon file changes    
  50.         watch: {  
  51.             scripts: {  
  52.                 files: ['Scripts/**/*.js'],  
  53.                 tasks: ['ts''uglify''copy']  
  54.             }  
  55.         }  
  56.     });  
  57.     // Define the default task so it will launch all other tasks    
  58.     grunt.registerTask('default', ['ts''uglify''copy''watch']);  
  59. };  
Step 7: Adding Dependencies to install Angular2 and all other files

We are using NPM to install our Angular2 in our web application. Open our Package.JSON file and the below dependencies. 
  1. "dependencies": {  
  2.     "@angular/http""2.0.0-rc.1",  
  3.     "angular2""^2.0.0-beta.8",  
  4.     "angular2-jwt""0.1.16",  
  5.     "angular2-meteor""0.5.5",  
  6.     "cors""2.7.1",  
  7.     "systemjs""0.19.22",  
  8.     "es6-promise""^3.0.2",  
  9.     "es6-shim""^0.33.3",  
  10.     "reflect-metadata""0.1.2",  
  11.     "rxjs""5.0.0-beta.2",  
  12.     "tsd""^0.6.5",  
  13.     "zone.js""0.5.15"  
  14.   },  
The edited Package.json file will look like the below image.



Save the file and wait for a few seconds to complete all the dependency installations.

 


Step 8 How to create our Angular2 App, boot using Type Script file.

Now it’s time to create our Angular2 application. First create a Folder named Scripts. Right click our project and click add new Folder and name the folder name as “Scripts”. Now we will create our TypeScript files inside this Scripts folder. To work with Angular2 we need to create 2 important TypeScript file.

  1. Component File where we write our Angular coding.
  2. Boot file: To run our component app .

Creating App TypeScript file

Right Click on Scripts folder and click on add new Item. Select TypeScript File and name the file as App.ts and click Add.



In App.ts file we have three parts:
  1. The import part
  2. Next is component part
  3. Next we have the class for writing our business logic. 
Here we can see a simple basic one way binding example to display the welcome message in side h1 tag.Here.

import part

First we import Angular2 files to be used in our component- - here we import http for using http client in our Angular2 component and import 
NgFor for using the looping and binding all the student detail array values one by one, and also we are importing one more typescript export class named StudentMasters from the model file. 
  1. import { Component, Injectable} from 'angular2/core';  
  2. import { NgFor } from 'angular2/common';  
  3. import {Http, Headers, Response} from 'angular2/http';  
  4. import { StudentMasters } from './model';  
  5. import 'rxjs/Rx';  
Next is component part

In component we have selector, directives and template. Selector is to give a name for this app and in our html file we use this selector name to display in our html page. In template we write our code. In template we bind the StudentMaster details using ngFOR.The student details will be loaded in our export class where we write all our business logic and http function to load data from WEB API. 

  1.  @Component({  
  2.     selector: "my-app",  
  3.     directives: [NgFor],  
  4.     template: `  
  5.             <h1 style="color:#467813;">ASP.NET Core / Angular2 and WEB API Demo </h1>  
  6. <hr>  
  7.   <h2>A Simple demo made by : <span style="color:#8340AF;">{{myName}} </span> </h2>  
  8.     
  9. <h2 style="color:#FF5733;"> Student Details retured from WEB API as JSON result  </h2>  
  10.  <h3 style="color:#C70039;">  
  11.    <ul>  
  12.       <li *ngFor="let std of student">  
  13.    <code> <span *ngFor="let stdArray of generateArray(std)"> {{stdArray}} </span> </code>  
  14. </li>  
  15.         
  16.     </ul>  
  17. </h3>  
  18.               `,  
  19.   
  20. })  
Export Class 

This is the main class where we do all our business logic and variable declaration to be used in our component template. In this class we have created a method named getData() and in this method we get the API method result and bind the result to the student array. In our component template we will be binding the result from this student array. 

  1. export class AppComponent {  
  2.     student: Array<StudentMasters> = [];  
  3.     myName: string;  
  4.     constructor(public http: Http) {  
  5.         this.myName = "Shanu";  
  6.         this.getData();  
  7.     }  
  8.   
  9.     getData() {  
  10.   
  11.         this.http.get('api/StudentMasters')  
  12.             .map((res: Response) => res.json())  
  13.             .subscribe(  
  14.             data => { this.student = data },  
  15.             err => console.error(err),  
  16.             () => console.log('done')  
  17.   
  18.             );  
  19.     }  
  20.     // to generate the JSON object as array  
  21.     generateArray(obj) {  
  22.         return Object.keys(obj).map((key) => { return obj[key] });  
  23.     }  
  24. }  
Next we need to add the boot.ts file to run our app.

Creating boot TypeScript file

Right Click on Scripts folder and click on add new Item. Select TypeScript File and name the file as boot.ts and click Add.



In boot.ts file we add the below code. Here first we import the ootsrap file to load and run our app file and also we import our app component. Note -- to import our app we need to give the same class name which was given in our app typescript file and give our app path in form of’./app’ .Next we run our app by adding the app name in bootstrap as bootstrap(myAppComponent);.  
  1. ///<reference path="../node_modules/angular2/typings/browser.d.ts" />    
  2.   
  3. import {bootstrap} from 'angular2/platform/browser'  
  4. import {ROUTER_PROVIDERS} from "angular2/router";  
  5. import {HTTP_PROVIDERS, HTTP_BINDINGS} from "angular2/http";  
  6. import {AppComponent} from './app'  
  7.   
  8. bootstrap(AppComponent, [HTTP_BINDINGS, HTTP_PROVIDERS]);  
Creating model TypeScript file

Right Click on Scripts folder and click on add new Item. Select TypeScript File and name the file as model.ts and click Add.



We use this model typescript file to create our Studentmasters model and declare all the public properties which we created in our MVC model.
 
  1. export class StudentMasters {  
  2.     constructor(  
  3.         public StdID: number,  
  4.         public StdName: string,  
  5.         public Email: string,  
  6.         public Phone: string,  
  7.         public Address: string  
  8.     ) { }  
  9. }  
Step 9: Creating HTML File

Next we need to create our html page to view result.To add the HTML file right click on wwwroot folder and click add new item, give the name as index.html and click Add.



In HTMl file replace the below code. Here we can see first in header part we add all the script reference files and in script we load our boot file to run our app. In the body part we display the result using the component selector name. In our app component we have given the selector name as “
myapp1”. In this HTML to display the result we add a tag like this <my-app>Please wait...</my-app> 
  1. <html>  
  2.   
  3. <head>  
  4.     <title>ASP.NET Core: AngularJS 2 Demo</title>  
  5.     <meta name="viewport" content="width=device-width, initial-scale=1">  
  6.     <!-- 1. Load libraries -->  
  7.     <!-- IE required polyfills -->  
  8.     <script src="/js/es6-shim.min.js"></script>  
  9.     <script src="/js/system-polyfills.js"></script>  
  10.     <!-- Angular2 libraries -->  
  11.     <script src="/js/angular2-polyfills.js"></script>  
  12.     <script src="/js/system.src.js"></script>  
  13.     <script src="/js/Rx.js"></script>  
  14.     <script src="/js/angular2.dev.js"></script>  
  15.     <script src="/js/router.dev.js"></script>  
  16.     <script src="/js/http.dev.js"></script>  
  17.     <!-- Bootstrap via SystemJS -->  
  18.     <script>  
  19.   
  20.         System.config  
  21.         ({  
  22.             packages:  
  23.             {  
  24.                 "app":  
  25.                 {  
  26.                     defaultExtension: 'js'  
  27.                 },  
  28.                 'lib': { defaultExtension: 'js' }  
  29.             }  
  30.         });  
  31.         System.import('app/boot').then(null, console.error.bind(console));  
  32.     </script>  
  33. </head>  
  34.   
  35. <body>  
  36.     <!-- Application PlaceHolder -->  
  37.     <my-app>Please wait...</my-app>  
  38.   
  39. </body>  
  40.   
  41. </html>  
So what is next? We have successfully created our first Angular2 and Asp.Net core 1.0 web application, and wait, do we have to do one more pending work to run our application? Yes we need to run our Grunt file to create our entire script file in our wwwroot scripts folder.

Step 8: Run the Grunt file using Visual Studio Task Runner Explorer

Now we need to run the Grunt file using Visual Studio Task Runner.

To view the Task Runner Click the menu View-> Other Windows,-> and click on Task Runner Explorer.



We can also open Task Runner by right clicking on our Gruntfile.js in Solution Explorer and click on Task Runner Explorer.



Now we can see our Task Runner Explorer.



Click on GruntFile.js and click on refresh button at top left.



Now we can see all the GruntFiles have been added.



Right click the default under Alias Task and click Run.



Now our Grunt file has been successfully run in our project. When we add a script file we can see new app.js file will be created in our wwwroot folder.

 
Run the Program

Here we can see all the data from WEB API has been bound to our HTML page using Angular2.