Today, we will create an ASP.NET MVC 4 application using AngularJS and perform CRUD (Create, Read, Update, and Delete) operations and Multi-Row Insert using Web API.


Background

The basic idea behind it is that some time ago, I was trying to search multi-row insert demos in MVC with Angular, using Web API but did not find any good solution. Then, I decided to write about this from a basic level. We all know that AngularJS is the most popular MVW (Model View Whatever) JavaScript framework for single page application development and believe that it's fun to develop applications on it.

Getting Started

After that, your application looks like this (note : expect AngularController).

The next step is to add new Model class in the Models directory. And, name it as StudentData.cs.

  1. namespace demoAngular.Models
  2. {
  3. public class StudentData
  4. {
  5. public int KeyId { get; set; }
  6. public string SName { get; set; }
  7. public string FName { get; set; }
  8. public string Gender { get; set; }
  9. public string MobileNo { get; set; }
  10. public int StateId { get; set; }
  11. public int CityID { get; set; }
  12. public int ProcID { get; set; }
  13. public string SXML { get; set; }
  14. public IEnumerable<StudentData> StudentDataList { get; set; }
  15. public List<ClassModel> ClassList { get; set; }
  16. }
  17. public class StateMaster
  18. {
  19. public int StateId { get; set; }
  20. public string StateName { get; set; }
  21. public IEnumerable<StateMaster> StateMasterList { get; set; }
  22. }
  23. public class CityMaster
  24. {
  25. public int CityID { get; set; }
  26. public string CityName { get; set; }
  27. public int StateId { get; set; }
  28. public IEnumerable<CityMaster> CityMasterList { get; set; }
  29. }
  30. public class ClassModel
  31. {
  32. public int StudentID { get; set; }
  33. public string ClassName { get; set; }
  34. public string BoardName { get; set; }
  35. public string CRollNo { get; set; }
  36. public int MM { get; set; }
  37. public int OM { get; set; }
  38. public int Divi { get; set; }
  39. public List<ClassModel> ClassList { get; set; }
  40. }
  41. }
After adding the StudentData.cs, add one model.cs file and give the name as DataLayer.cs.

Namespaces
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Data.Entity;
  6. using System.Data.Entity.Infrastructure;
  7. using System.Data.SqlClient;
  8. namespace demoAngular.Models
  9. {
  10. public class DataLayer : DbContext
  11. {
  12. public virtual IEnumerable<StudentData> StudentSubmiteDetails(StudentData Model)
  13. {
  14. var sqlParams = new SqlParameter[]{
  15. new SqlParameter { ParameterName = "@KeyId",Value=Model.KeyId==null?0:Model.KeyId},
  16. new SqlParameter { ParameterName = "@SName",Value=Model.SName??string.Empty},
  17. new SqlParameter { ParameterName = "@FName",Value=Model.FName??string.Empty},
  18. new SqlParameter { ParameterName = "@Gender", Value = Model.Gender??string.Empty },
  19. new SqlParameter { ParameterName = "@MobileNo", Value = Model.MobileNo??string.Empty},
  20. new SqlParameter { ParameterName = "@StateId",Value=Model.StateId==null?0:Model.StateId},
  21. new SqlParameter { ParameterName = "@CityID",Value=Model.CityID==null?0:Model.CityID},
  22. new SqlParameter { ParameterName = "@ProcID", Value = Model.ProcID},
  23. new SqlParameter { ParameterName = "@XML", Value = Model.SXML}
  24. };
  25. var sqlQaury = @"PROC_StudentSubmitDetails @KeyId, @SName,@FName,@Gender,@MobileNo,@StateId,@CityID,@ProcID,@XML";
  26. var IList = this.Database.SqlQuery<StudentData>(sqlQaury, sqlParams);
  27. return IList;
  28. }
  29. public IEnumerable<StudentData> StudentALLDetails(int ProcID, int Keyid)
  30. {
  31. var sqlParams = new SqlParameter[]{
  32. new SqlParameter { ParameterName = "@ProcID", Value = ProcID},
  33. new SqlParameter { ParameterName = "@Keyid", Value = Keyid}};
  34. var sqlQaury = @"PROC_StudentALLDetails @ProcID,@Keyid";
  35. var IList = this.Database.SqlQuery<StudentData>(sqlQaury, sqlParams);
  36. return IList;
  37. }
  38. public IEnumerable<StudentData> StudentOneDetails(int ProcID, int Keyid)
  39. {
  40. var sqlParams = new SqlParameter[]{
  41. new SqlParameter { ParameterName = "@ProcID", Value = ProcID},
  42. new SqlParameter { ParameterName = "@Keyid", Value = Keyid}};
  43. var sqlQaury = @"PROC_StudentALLDetails @ProcID,@Keyid";
  44. var IList = this.Database.SqlQuery<StudentData>(sqlQaury, sqlParams);
  45. return IList;
  46. }
  47. public IEnumerable<ClassModel> StudenteduDetails(int ProcID, int Keyid)
  48. {
  49. var sqlParams = new SqlParameter[]{
  50. new SqlParameter { ParameterName = "@ProcID", Value = ProcID},
  51. new SqlParameter { ParameterName = "@Keyid", Value = Keyid}};
  52. var sqlQaury = @"PROC_StudentALLDetails @ProcID,@Keyid";
  53. var IList = this.Database.SqlQuery<ClassModel>(sqlQaury, sqlParams);
  54. return IList;
  55. }
  56. public IEnumerable<StateMaster> BindLstate(int Procid)
  57. {
  58. var sqlParms = new SqlParameter[]{
  59. new SqlParameter{ParameterName="@Procid",Value=Procid},};
  60. var sqlqaury = @"Proc_getState @Procid";
  61. var IList = this.Database.SqlQuery<StateMaster>(sqlqaury, sqlParms);
  62. return IList;
  63. }
  64. public IEnumerable<CityMaster> BindLcity(int Pracid, int stateid)
  65. {
  66. var sqlParms = new SqlParameter[]{
  67. new SqlParameter{ParameterName="@Procid",Value=Pracid},
  68. new SqlParameter{ParameterName="@Stateid",Value=stateid}};
  69. var sqlQaury = @"Proc_getState @Procid,@Stateid";
  70. var IList = this.Database.SqlQuery<CityMaster>(sqlQaury, sqlParms);
  71. return IList;
  72. }
  73. public IEnumerable<StudentData> DeleteStudentbyid(int ProcID, int Keyid)
  74. {
  75. var sqlParams = new SqlParameter[]{
  76. new SqlParameter { ParameterName = "@ProcID", Value = ProcID},
  77. new SqlParameter { ParameterName = "@Keyid", Value = Keyid}};
  78. var sqlQaury = @"PROC_StudentALLDetails @ProcID,@Keyid";
  79. var IList = this.Database.SqlQuery<StudentData>(sqlQaury, sqlParams);
  80. return IList;
  81. }
  82. }
  83. }


After adding Model, your project looks like this,

Now, add Controller to the Controllers directory and give name as HomeController,
  1. namespace demoAngular.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5. public ActionResult Index()
  6. {
  7. return View();
  8. }
  9. public ActionResult StudentRecord()
  10. {
  11. return PartialView("StudentRecord");
  12. }
  13. public ActionResult StudentView()
  14. {
  15. return PartialView("StudentView");
  16. }
  17. }
  18. }
Now, add another Controller to and give name as ValueController,

Namespaces
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Web.Http;
  7. using System.Xml.Linq;
  8. using demoAngular.Models;
  9. using Newtonsoft.Json;
  10. namespace demoAngular.Controllers
  11. {
  12. public class ValuesController : ApiController
  13. {
  14. DataLayer db = new DataLayer();
  15. [HttpPost]
  16. [ActionName("AddNewStudent")]
  17. public StudentData AddnewStudent(StudentData Model)
  18. {
  19. Model.ProcID = 1;
  20. List<ClassModel> valueSet = Model.ClassList;
  21. XElement root = new XElement("root");
  22. for (int i = 0; i < valueSet.Count; i++)
  23. {
  24. XElement ele = new XElement("Student", new XElement("ClassName", valueSet[i].ClassName),
  25. new XElement("BoardName", valueSet[i].BoardName),
  26. new XElement("CRollNo", valueSet[i].CRollNo),
  27. new XElement("MM", valueSet[i].MM),
  28. new XElement("OM", valueSet[i].OM),
  29. new XElement("Divi", valueSet[i].Divi));
  30. root.Add(ele);
  31. }
  32. XElement xmlclass = root;
  33. Model.SXML = xmlclass.ToString();
  34. var mod = db.StudentSubmiteDetails(Model).ToList();
  35. return mod.FirstOrDefault();
  36. }
  37. [HttpGet]
  38. [ActionName("ShowALLStudent")]
  39. public IEnumerable<StudentData> ShowALLStudent()
  40. {
  41. var mod = db.StudentALLDetails(2,0).ToList();
  42. return mod;
  43. }
  44. [HttpGet]
  45. [ActionName("ShowOneStudent")]
  46. public IEnumerable<StudentData> ShowOneStudent(int id)
  47. {
  48. var mod = db.StudentOneDetails(3, id).ToList();
  49. return mod;
  50. }
  51. [HttpGet]
  52. [ActionName("ShowEduStudent")]
  53. public IEnumerable<ClassModel> ShowEduStudent(int id)
  54. {
  55. ClassModel mod1 = new ClassModel();
  56. mod1.ClassList = db.StudenteduDetails(4, id).ToList();
  57. return mod1.ClassList;
  58. }
  59. [HttpGet]
  60. [ActionName("ShowState")]
  61. public IEnumerable<StateMaster> ShowState()
  62. {
  63. var mod = db.BindLstate(1).ToList();
  64. return mod;
  65. }
  66. [HttpGet]
  67. [ActionName("ShowCity")]
  68. public IEnumerable<CityMaster> ShowCity(int id)
  69. {
  70. var mod = db.BindLcity(2,id).ToList();
  71. return mod;
  72. }
  73. [HttpDelete]
  74. [ActionName("DeleteStudent")]
  75. public IEnumerable<StudentData> DeleteStudent(int id)
  76. {
  77. var mod = db.DeleteStudentbyid(5, id).ToList();
  78. return mod;
  79. }
  80. }
  81. }


After adding Controller, your project looks like this.



Now, add AngularJS using Manage Nuget Package Manager and search AngularJS. And install it (it’s already instaledl in my project that's why it is showing uninstall)



Now, add a new folder, give name as AngularController, and add JavaScript file in the AngularController directory and add Angular functions.



RohitService.js
  1. app.service("RohitService", function ($http) {
  2. //Function to create new Student
  3. this.AddNewStudent = function (Student) {
  4. var request = $http({
  5. method: "post",
  6. url: "/api/Values/AddNewStudent",
  7. data: Student
  8. });
  9. return request;
  10. };
  11. this.ShowStudent = function () {
  12. var request = $http({
  13. method: "get",
  14. url: "/api/Values/ShowALLStudent",
  15. cache: false,
  16. async: false
  17. });
  18. return request;
  19. };
  20. this.showStudentone = function (id) {
  21. var request = $http({
  22. method: "get",
  23. url: "/api/Values/ShowOneStudent/" + id,
  24. cache: false,
  25. async: false
  26. });
  27. return request;
  28. }
  29. this.showEduStudent = function (id) {
  30. var request = $http({
  31. method: "get",
  32. url: "/api/Values/ShowEduStudent/" + id,
  33. cache: false,
  34. async: false
  35. });
  36. return request;
  37. }
  38. this.getState = function () {
  39. var request = $http({
  40. method: "get",
  41. url: "/api/Values/ShowState",
  42. //dataType: "json",
  43. cache: false,
  44. async: false
  45. });
  46. return request;
  47. };
  48. this.getCity = function (id) {
  49. var request = $http({
  50. method: "get",
  51. url: "/api/Values/ShowCity/" + id,
  52. cache: false,
  53. async: false
  54. });
  55. return request;
  56. }
  57. this.deleteStudentKey = function (id) {
  58. var request = $http({
  59. method: "delete",
  60. url: "/api/Values/DeleteStudent/" + id,
  61. cache: false,
  62. async: false
  63. });
  64. return request;
  65. }
  66. });
StudentRecordcontroller.js (it is angular controller)
  1. app.controller("StudentRecordcontroller", function ($scope, RohitService, $location, ShareData) {
  2. $scope.val = "Submit";
  3. loadStateName();
  4. loadStudentRecord();
  5. if (ShareData.KeyId == "0") {
  6. resetForm();
  7. }
  8. $scope.finalSubmit = function () {
  9. var Student = {
  10. KeyId: $scope.KeyId,
  11. SName: $scope.SName,
  12. FName: $scope.FName,
  13. Gender: $scope.Gender,
  14. MobileNo: $scope.MobileNo,
  15. StateId: $scope.StateId.StateId,
  16. CityID: $scope.CityID.CityID,
  17. ClassList: $scope.ClassModel
  18. };
  19. var promisePost = RohitService.AddNewStudent(Student);
  20. promisePost.then(function (pl) {
  21. var student = pl.data;
  22. if ($scope.val == "Submit") {
  23. alert('your record save successfully');
  24. }
  25. else {
  26. alert('your record update successfully');
  27. $scope.val = "Submit";
  28. }
  29. resetForm();
  30. },
  31. function (errorPl) {
  32. alert('Error In Request ,Try Again Later');
  33. })
  34. };
  35. $scope.restSubmit = function () {
  36. resetForm();
  37. };
  38. function resetForm() {
  39. $scope.SName = null;
  40. $scope.FName = null;
  41. $scope.Gender= null;
  42. $scope.MobileNo = null;
  43. $scope.StateId = null;
  44. $scope.CityID = null;
  45. $scope.ClassModel = [{ Index: "0", "ClassName": "", "BoardName": "", "CRollNo": "", "MM": "", "OM": "", "Divi": "" }];
  46. $scope.val = "Submit";
  47. }
  48. function loadStudentRecord() {
  49. var KeyId=ShareData.KeyId;
  50. var promiseStudentRecord = RohitService.showStudentone(KeyId);
  51. promiseStudentRecord.then(function (pl) {
  52. var values=''
  53. var stud = pl.data;
  54. $scope.KeyId = stud[0].KeyId,
  55. $scope.SName = stud[0].SName,
  56. $scope.FName = stud[0].FName,
  57. $scope.Gender = stud[0].Gender,
  58. $scope.MobileNo = stud[0].MobileNo,
  59. $scope.StateId = { "StateId": stud[0].StateId };
  60. StateNameChange();
  61. $scope.CityID = { "CityID": stud[0].CityID };
  62. loadEduRecord(stud[0].KeyId);
  63. $scope.val = "Update";
  64. ShareData.KeyId = "0";
  65. },
  66. function (errorPl) {
  67. $scope.error = errorPl;
  68. });
  69. }
  70. function loadEduRecord(id) {
  71. var promiseStudentRecord = RohitService.showEduStudent(id);
  72. promiseStudentRecord.then(function (pl) {
  73. var stud = pl.data;
  74. $scope.ClassModel = stud;
  75. },
  76. function (errorPl) {
  77. $scope.error = errorPl;
  78. });
  79. }
  80. function loadStateName() {
  81. var promiseStateName = RohitService.getState();
  82. promiseStateName.then(function (pl) {
  83. $scope.States = pl.data
  84. },
  85. function (errorPl) {
  86. $scope.error = errorPl;
  87. });
  88. }
  89. $scope.OnStateNameChange = function () {
  90. StateNameChange();
  91. }
  92. function StateNameChange() {
  93. if (angular.isDefined($scope.StateId.StateId)) {
  94. var StateNameid = $scope.StateId.StateId;
  95. var promiseCityName = RohitService.getCity(StateNameid);
  96. promiseCityName.then(function (pl) {
  97. $scope.Cities = pl.data
  98. },
  99. function (errorPl) {
  100. $scope.error = errorPl;
  101. });
  102. }
  103. }
  104. $scope.ClassModel = [{ Index: "0", "ClassName": "", "BoardName": "", "CRollNo": "", "MM": "", "OM": "", "Divi": "" }
  105. //,{ Index: "1", "ClassName": "Intermediate", "BoardName": "XII", "CRollNo": "", "MM": "", "OM": "", "Divi": "I" }
  106. ];
  107. $scope.add = function () {
  108. var a = $scope.ClassModel.length;
  109. $scope.ClassModel.push({
  110. 'Index':a,
  111. 'ClassName': "",
  112. 'BoardName':"",
  113. 'CRollNo': "",
  114. 'MM': "",
  115. 'OM': "",
  116. 'Divi': ""
  117. });
  118. }
  119. //$scope.remove = function (Index) {
  120. // if (confirm('Are you sure to delete ?')) {
  121. // $scope.ClassModel.splice(Index, 1);
  122. // }
  123. //};
  124. $scope.remove = function (index)
  125. {
  126. if (confirm('Are you sure to delete?'))
  127. {
  128. var index = -1;
  129. var comArr = eval($scope.ClassModel);
  130. for (var i = 0; i < comArr.length; i++)
  131. {
  132. if (comArr[i].Index ===Index)
  133. {
  134. index = i;
  135. break;
  136. }
  137. }
  138. }
  139. if (index === -1)
  140. {
  141. alert("Something goes wrong !")
  142. }
  143. $scope.ClassModel.splice(index,1)
  144. }
  145. });


StudentViewController.js



Now, add the View. After adding View, your project looks like this.

Index.cshtml
  1. <!DOCTYPE html>
  2. <html data-ng-app="AngularModule">
  3. <head>
  4. <script src="~/Scripts/angular.min.js"></script>
  5. <script src="~/Scripts/angular-route.min.js"></script>
  6. <link href="~/Content/Styletest.css" rel="stylesheet" />
  7. <script src="~/AngularController/RohitRoute.js"></script>
  8. <script src="~/AngularController/RohitService.js"></script>
  9. <script src="~/AngularController/StudentRecordcontroller.js"></script>
  10. <script src="~/AngularController/StudentViewcontroller.js"></script>
  11. </head>
  12. <body>
  13. <table style="width: 99%;">
  14. <tr>
  15. <td colspan="2" class="Header">
  16. <center><h1>Angular Test Header</h1></center>
  17. </td>
  18. </tr>
  19. <tr>
  20. <td class="left">
  21. <ul>
  22. <li><a href="#/studentRecord">Application Form</a></li>
  23. <li><a href="#/studentView">View Form</a></li>
  24. </ul>
  25. </td>
  26. <td class="right">
  27. <ng-view>
  28. </ng-view>
  29. </td>
  30. </tr>
  31. <tr>
  32. <td colspan="2" class="footer">
  33. <center><h1>Footer</h1></center>
  34. </td>
  35. </tr>
  36. </table>
  37. </body>
  38. </html>
StudentRecord.cshtml
  1. @{
  2. ViewBag.Title = "Student Record";
  3. }
  4. <h2>Student Record</h2>
  5. <table style="vertical-align: top">
  6. <tr data-ng-show="false">
  7. <td>Student Name
  8. </td>
  9. <td>:
  10. </td>
  11. <td>
  12. <input type="text" data-ng-model="KeyId" />
  13. </td>
  14. </tr>
  15. <tr>
  16. <td>Student Name
  17. </td>
  18. <td>:
  19. </td>
  20. <td>
  21. <input type="text" data-ng-model="SName" />
  22. </td>
  23. </tr>
  24. <tr>
  25. <td>Fathe's Name
  26. </td>
  27. <td>:
  28. </td>
  29. <td>
  30. <input type="text" data-ng-model="FName" />
  31. </td>
  32. </tr>
  33. <tr>
  34. <td>Gender
  35. </td>
  36. <td>:
  37. </td>
  38. <td>
  39. <input type="radio" data-ng-model="Gender" style="width: 15px;" value="Male" />
  40. Male
  41. <input type="radio" data-ng-model="Gender" style="width: 15px;" value="Female" />
  42. Female
  43. </td>
  44. </tr>
  45. <tr>
  46. <td>Mobile No
  47. </td>
  48. <td>:
  49. </td>
  50. <td>
  51. <input type="text" data-ng-model="MobileNo" />
  52. </td>
  53. </tr>
  54. <tr>
  55. <td>State Name
  56. </td>
  57. <td>:
  58. </td>
  59. <td>
  60. <select name="ddlState" id="ddlState" ng-model="StateId" ng-options="a.StateName for a in States track by a.StateId" data-ng-change="OnStateNameChange()">
  61. <option value="">--Select--</option>
  62. </select>
  63. </td>
  64. </tr>
  65. <tr>
  66. <td>City Name
  67. </td>
  68. <td>:
  69. </td>
  70. <td>
  71. <select name="ddlCity" id="ddlCity" ng-model="CityID" ng-options="b.CityName for b in Cities track by b.CityID">
  72. <option value="">--Select--</option>
  73. </select>
  74. </td>
  75. </tr>
  76. <tr>
  77. <td></td>
  78. <td></td>
  79. <td>
  80. <input type="submit" data-ng-click="finalSubmit();" value="{{val}}" />
  81. <input type="submit" data-ng-click="restSubmit();" value="Rest" />
  82. <input type="hidden" data-ng-model="KeyId" />
  83. </td>
  84. </tr>
  85. </table>
  86. <table class="table table-striped table-bordered">
  87. <thead>
  88. <tr>
  89. <th>ID</th>
  90. <th>ClassName</th>
  91. <th>BoardName</th>
  92. <th>CRollNo</th>
  93. <th>MM</th>
  94. <th>OM</th>
  95. <th>Divi</th>
  96. </tr>
  97. </thead>
  98. <tbody>
  99. <tr ng-repeat="cls in ClassModel" id="{{$index+1}}">
  100. <td>{{$index+1}}</td>
  101. <td>
  102. <input type="text" ng-model="cls.ClassName" style="width: 150px;" /></td>
  103. <td>
  104. <input type="text" ng-model="cls.BoardName" style="width: 150px;" /></td>
  105. <td>
  106. <input type="text" ng-model="cls.CRollNo" style="width: 150px;" /></td>
  107. <td>
  108. <input type="text" ng-model="cls.MM" style="width: 50px;" /></td>
  109. <td>
  110. <input type="text" ng-model="cls.OM" style="width: 50px;" /></td>
  111. <td>
  112. <input type="text" ng-model="cls.Divi" style="width: 50px;" /></td>
  113. <td>
  114. <input type="submit" ng-click="add()" value="Add" /></td>
  115. <td>
  116. <input type="submit" ng-click="remove(cls.Index)" value="Delete" ng-show="{{cls.Index!=0}}" /></td>
  117. </tr>
  118. </tbody>
  119. </table>
StudentView.cshtml
  1. @{
  2. ViewBag.Title = "Student View";
  3. }
  4. <h2>Student View</h2>
  5. <table>
  6. <tr>
  7. <thead>
  8. <th>Student Name
  9. </th>
  10. <th>Father's Name
  11. </th>
  12. <th>Gender
  13. </th>
  14. <th>Mobile No.
  15. </th>
  16. </thead>
  17. </tr>
  18. <tr>
  19. <tbody data-ng-repeat="students in student">
  20. </td>
  21. <td>{{students.SName | uppercase}}
  22. </td>
  23. <td>{{students.FName}}
  24. </td>
  25. <td>{{students.Gender}}
  26. </td>
  27. <td>{{students.MobileNo}}
  28. </td>
  29. <td>
  30. <span data-ng-click="editEmployee(students.KeyId)">Edit</span>
  31. <span data-ng-click="deleteEmployee(students.KeyId)">Delete</span>
  32. </td>
  33. </tbody>
  34. </tr>
  35. </table>
Now, build your project and run it.

After running your application it's here .