CRUD Operation in ASP.NET MVC 4 and AngularJS

Hi, Today we will create an ASP.NET MVC 4 Application using AngularJS and perform CRUD (Create, Read, Update and Delete) operations using SPA (Single Page Application).

Let’s create a new MVC Application by Opening Visual Studio 2013.

1. File –> New –> Project –> Select ASP.NET Web Application & give the name as “CRUD_AngularJS_ASPNET_MVC”.

CRUD Operation in ASP.NET MVC 4 and AngularJS

2. Click on OK will open a new window, select MVC template & click on Change Authentication will open a popup on this select “No Authentication” and click on OK, OK will close the windows and create a new MVC 4.0 template project.

CRUD Operation in ASP.NET MVC 4 and AngularJS

3. Create a new Model class with name as Book.cs and add below listed properties.

public class Book
    {
        [Key]
        public int Id { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public string Publisher { get; set; }
        public string Isbn { get; set; }
    }

4. Add new BookDBContext.cs class in the model folder and add below code.

public class BookDBContext : DbContext
    {
        public DbSet<Book> book { get; set; }
    }

5. As we need to add System.Data.Entity namespace for which we have to install EntityFramework, to install this Goto Tools -> NuGet Package Manager -> Package Manager Console. In the Package Manager Console type below command "Install-Package EntityFramework as shown below image.

CRUD Operation in ASP.NET MVC 4 and AngularJS

6. Now let's add code in HomeController to get, add, edit and delete book records. (delete existing code)

public class HomeController : Controller
    {
        // GET: Book
        public ActionResult Index()
        {
            return View();
        }
    // GET: All books
    public JsonResult GetAllBooks()
    {
        using (BookDBContext contextObj = new BookDBContext())
        {
            var bookList = contextObj.book.ToList();
            return Json(bookList, JsonRequestBehavior.AllowGet);
        }
    }
    //GET: Book by Id
    public JsonResult GetBookById(string id)
    {
        using (BookDBContext contextObj = new BookDBContext())
        {
            var bookId = Convert.ToInt32(id);
            var getBookById = contextObj.book.Find(bookId);
            return Json(getBookById, JsonRequestBehavior.AllowGet);
        }
    }
    //Update Book
    public string UpdateBook(Book book)
    {
        if (book != null)
        {
            using (BookDBContext contextObj = new BookDBContext())
            {
                int bookId = Convert.ToInt32(book.Id);
                Book _book = contextObj.book.Where(b =&gt; b.Id == bookId).FirstOrDefault();
                _book.Title = book.Title;
                _book.Author = book.Author;
                _book.Publisher = book.Publisher;
                _book.Isbn = book.Isbn;
                contextObj.SaveChanges();
                return "Book record updated successfully";
            }
        }
        else
        {
            return "Invalid book record";
        }
    }
    // Add book
    public string AddBook(Book book)
    {
        if (book != null)
        {
            using (BookDBContext contextObj = new BookDBContext())
            {
                contextObj.book.Add(book);
                contextObj.SaveChanges();
                return "Book record added successfully";
            }
        }
        else
        {
            return "Invalid book record";
        }
    }
    // Delete book
    public string DeleteBook(string bookId)
    {

        if (!String.IsNullOrEmpty(bookId))
        {
            try
            {
                int _bookId = Int32.Parse(bookId);
                using (BookDBContext contextObj = new BookDBContext())
                {
                    var _book = contextObj.book.Find(_bookId);
                    contextObj.book.Remove(_book);
                    contextObj.SaveChanges();
                    return "Selected book record deleted sucessfully";
                }
            }
            catch (Exception)
            {
                return "Book details not found";
            }
        }
        else
        {
            return "Invalid operation";
        }
    }
}</pre>

7. Add database connection in web.config (Database will be created using EF once we will add book data first time)

Insert code here...  <connectionStrings>
    <add name="BookDBContext" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-CrudInAj-201412222;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-CrudInAj-201412222.mdf" />
  </connectionStrings>

8. Now we have to add view markup using AngularJS directives (ng-model & ng-click) but before this we have to add AngularJS in our project using Package Manager Console (open PMC and write command "Install-Package AngularJS" will install AngularJS).

9. Go to Scripts and create a new folder as BookScripts, under BookScripts folder create 3 new js files as Controller.js, Module.js & Service.js.

10. Open BundleConfig.cs under App_Start and add below code.

bundles.Add(new ScriptBundle("~/bundles/angularJS").Include(
                     "~/Scripts/angular.js"));

bundles.Add(new ScriptBundle("~/bundles/customJS").Include( "~/Scripts/BookScripts/Module.js", "~/Scripts/BookScripts/Service.js", "~/Scripts/BookScripts/Controller.js"));

11. Open Views -> Shared -> _Layout.cshtml and add @Script.Render block in the head tag of the page.

@Scripts.Render("~/bundles/angularJS")
@Scripts.Render("~/bundles/customJS")

12. Add ng-app AnularJS directive in the HTML section of the page and give name as mvcCRUDApp (removed About & Contact links). full page code is as below

<!DOCTYPE html>
<html ng-app="mvcCRUDApp">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Scripts.Render("~/bundles/angularJS")
    @Scripts.Render("~/bundles/customJS")
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Book Management", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                </ul>
                <p class="nav navbar-text navbar-right">Hello, @User.Identity.Name!</p>
            </div>
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>© @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)

</body> </html>

13. Open Module.js and define angular module as below

var app = angular.module("mvcCRUDApp", []);

14. Open Service.js and define functions for Add, Update, Get and Delete book functions.

app.service("crudAJService", function ($http) {
//get All Books
this.getBooks = function () {
    return $http.get("Home/GetAllBooks");
};

// get Book by bookId
this.getBook = function (bookId) {
    var response = $http({
        method: "post",
        url: "Home/GetBookById",
        params: {
            id: JSON.stringify(bookId)
        }
    });
    return response;
}

// Update Book 
this.updateBook = function (book) {
    var response = $http({
        method: "post",
        url: "Home/UpdateBook",
        data: JSON.stringify(book),
        dataType: "json"
    });
    return response;
}

// Add Book
this.AddBook = function (book) {
    var response = $http({
        method: "post",
        url: "Home/AddBook",
        data: JSON.stringify(book),
        dataType: "json"
    });
    return response;
}

//Delete Book
this.DeleteBook = function (bookId) {
    var response = $http({
        method: "post",
        url: "Home/DeleteBook",
        params: {
            bookId: JSON.stringify(bookId)
        }
    });
    return response;
}

});

15. Open Controller.js and add functions for GetAllBooks(), EditBook(), AddUpdateBook(), DeleteBook() & ClearFields()

app.controller("mvcCRUDCtrl", function ($scope, crudAJService) {
    $scope.divBook = false;
    GetAllBooks();
    //To Get all book records  
    function GetAllBooks() {
        debugger;
        var getBookData = crudAJService.getBooks();
        getBookData.then(function (book) {
            $scope.books = book.data;
        }, function () {
            alert('Error in getting book records');
        });
    }
$scope.editBook = function (book) {
    var getBookData = crudAJService.getBook(book.Id);
    getBookData.then(function (_book) {
        $scope.book = _book.data;
        $scope.bookId = book.Id;
        $scope.bookTitle = book.Title;
        $scope.bookAuthor = book.Author;
        $scope.bookPublisher = book.Publisher;
        $scope.bookIsbn = book.Isbn;
        $scope.Action = "Update";
        $scope.divBook = true;
    }, function () {
        alert('Error in getting book records');
    });
}

$scope.AddUpdateBook = function () {
    var Book = {
        Title: $scope.bookTitle,
        Author: $scope.bookAuthor,
        Publisher: $scope.bookPublisher,
        Isbn: $scope.bookIsbn
    };
    var getBookAction = $scope.Action;

    if (getBookAction == "Update") {
        Book.Id = $scope.bookId;
        var getBookData = crudAJService.updateBook(Book);
        getBookData.then(function (msg) {
            GetAllBooks();
            alert(msg.data);
            $scope.divBook = false;
        }, function () {
            alert('Error in updating book record');
        });
    } else {
        var getBookData = crudAJService.AddBook(Book);
        getBookData.then(function (msg) {
            GetAllBooks();
            alert(msg.data);
            $scope.divBook = false;
        }, function () {
            alert('Error in adding book record');
        });
    }
}

$scope.AddBookDiv = function () {
    ClearFields();
    $scope.Action = "Add";
    $scope.divBook = true;
}

$scope.deleteBook = function (book) {
    var getBookData = crudAJService.DeleteBook(book.Id);
    getBookData.then(function (msg) {
        alert(msg.data);
        GetAllBooks();
    }, function () {
        alert('Error in deleting book record');
    });
}

function ClearFields() {
    $scope.bookId = "";
    $scope.bookTitle = "";
    $scope.bookAuthor = "";
    $scope.bookPublisher = "";
    $scope.bookIsbn = "";
}
$scope.Cancel = function () {
    $scope.divBook = false;
};

});

16. At last open Views -> Home -> Index.cshtml and remove existing code and add code as below

@{
    ViewBag.Title = "Home Page";
}
<div ng-controller="mvcCRUDCtrl">
    <div class="divList">
        <p><b><i>Book List</i></b></p>
        <table class="table table-hover">
            <tr>
                <td><b>ID</b></td>
                <td><b>Title</b></td>
                <td><b>Author</b></td>
                <td><b>Publisher</b></td>
                <td><b>Isbn</b></td>
                <td><b>Action</b></td>
            </tr>
            <tr ng-repeat="book in books">
                <td>
                    {{book.Id}}
                </td>
                <td>
                    {{book.Title}}
                </td>
                <td>
                    {{book.Author}}
                </td>
                <td>
                    {{book.Publisher}}
                </td>
                <td>
                    {{book.Isbn}}
                </td>
                <td>
                    <span ng-click="editBook(book)" class="btn btn-primary">Edit</span>
                    <span ng-click="deleteBook(book)" class="btn btn-danger">Delete</span>
                </td>
            </tr>
        </table>
    </div>
    <span ng-click="AddBookDiv()" class="btn btn-default" >
        Add Book
    </span>
    <div ng-show="divBook">
        <p class="divHead"></p>
        <table class="table">
            <tr>
                <td><b><i>{{Action}} Book</i></b></td>
                <td></td>
                <td></td>
                <td></td>
            </tr> 
            <tr>
                <td><b>Id</b></td>
                <td>
                    <input type="text" disabled="disabled" ng-model="bookId" />
                </td>
                <td><b>Title</b></td>
                <td>
                    <input type="text" ng-model="bookTitle" />
                </td>
            </tr>           
            <tr>
                <td><b>Author</b></td>
                <td>
                    <input type="text" ng-model="bookAuthor" />
                </td>
                <td><b>Publisher</b></td>
                <td>
                    <input type="text" ng-model="bookPublisher" />
                </td>
            </tr>
            <tr>
                <td><b>Isbn</b></td>
                <td>
                    <input type="text" ng-model="bookIsbn" />
                </td>
                <td></td>
                <td >
                    <input type="button" class="btn btn-default" value="Save" ng-click="AddUpdateBook()" />
                    <input type="button" class="btn btn-danger" value="Cancel" ng-click="Cancel()" />
                </td>
            </tr>
        </table>        
    </div>
</div>

17. Run the application and you can Create, Read, Update & Delete book details.

CRUD Operation in ASP.NET MVC 4 and AngularJS

 

Source Code

2 Comments

Comments have been disabled for this content.