In my last article we saw how to display data using Knockout using MVC 4
here. Now in this article you will see how to add a new record, delete and edit data using Knockout in
MVC 4.
Read my first article about how to start and how to display data. In this article we will learn only how to add a new record, delete a record, and edit a record.
Do this in my model class.
- public class Employee
- {
- public int EmployeeID { get; set; }
- public string LastName { get; set; }
- public string FirstName { get; set; }
- public string City { get; set; }
- public string Region { get; set; }
- public string PostalCode { get; set; }
- public string Country { get; set; }
- }
This is the repository class; as you can see this class is inherited by the interface so the interface code is below this.
- public class EmployeeRepository: KnockoutSample.Models.IEmployeeRepository {
- private List < Employee > employeeList = new List < Employee > ();
- private int _nextId = 1;
-
- public EmployeeRepository() {
-
- Add(new Employee { EmployeeID = 1, FirstName = "Nancy", LastName = "Davolio", City = "Seattle", Region = "WA", PostalCode = "98122", Country = "USA" });
- Add(new Employee { EmployeeID = 2, FirstName = "Andrew", LastName = "Fuller", City = "Tacoma", Region = "WA", PostalCode = "98401", Country = "USA" });
- Add(new Employee { EmployeeID = 3, FirstName = "Janet", LastName = "Leverling", City = "Kirkland", Region = "WA", PostalCode = "98033", Country = "USA" });
- Add(new Employee { EmployeeID = 4, FirstName = "Margaret", LastName = "Peacock", City = "Redmond", Region = "WA", PostalCode = "98052", Country = "USA" });
- Add(new Employee { EmployeeID = 5, FirstName = "Steven", LastName = "Buchanan", City = "London", Region = "WA", PostalCode = "SW1 8JR", Country = "UK" });
- Add(new Employee { EmployeeID = 6, FirstName = "Michael", LastName = "Suyama", City = "London", Region = "WA", PostalCode = "EC2 7JR", Country = "UK" });
- Add(new Employee { EmployeeID = 7, FirstName = "Robert", LastName = "King", City = "London", Region = "WA", PostalCode = "RG1 9SP", Country = "UK" });
- Add(new Employee { EmployeeID = 8, FirstName = "Laura", LastName = "Callahan", City = "Seattle", Region = "WA", PostalCode = "98105", Country = "USA" });
- Add(new Employee { EmployeeID = 9, FirstName = "Anne", LastName = "Dodsworth", City = "London", Region = "WA", PostalCode = "WG2 7LT", Country = "UK" });
-
- }
-
- public IEnumerable < Employee > GetAll() {
-
- return employeeList;
- }
-
- public Employee Get(int id) {
-
- return employeeList.Find(p => p.EmployeeID == id);
- }
-
- public Employee Add(Employee item) {
- if (item == null) {
- throw new ArgumentNullException("item");
- }
-
-
- item.EmployeeID = _nextId++;
- employeeList.Add(item);
-
- return item;
- }
-
- public bool Update(Employee item) {
- if (item == null) {
- throw new ArgumentNullException("item");
- }
-
-
- int index = employeeList.FindIndex(p => p.EmployeeID == item.EmployeeID);
- if (index == -1) {
- return false;
- }
- employeeList.RemoveAt(index);
- employeeList.Insert(index, item);
-
- return true;
- }
-
- public bool Delete(int id) {
-
- employeeList.RemoveAll(p => p.EmployeeID == id);
-
- return true;
- }
-
- }
And this is the repository interface.
- interface IEmployeeRepository {
- Employee Add(Employee item);
- bool Delete(int id);
- Employee Get(int id);
- System.Collections.Generic.IEnumerable < Employee > GetAll();
- bool Update(Employee item);
- }
And this is the repository interface.
- static readonly IEmployeeRepository repository = new EmployeeRepository();
-
-
- public ActionResult Employee() {
- return View();
- }
-
-
- public JsonResult GetAllEmployees() {
- return Json(repository.GetAll(), JsonRequestBehavior.AllowGet);
- }
-
-
- public JsonResult CreateEmployee(Employee item) {
- item = repository.Add(item);
- return Json(item, JsonRequestBehavior.AllowGet);
- }
-
- public JsonResult EditEmployee(int EmployeeID, Employee employee) {
- employee.EmployeeID = EmployeeID;
- if (repository.Update(employee)) {
- return Json(repository.GetAll(), JsonRequestBehavior.AllowGet);
- }
- return Json(null);
- }
-
-
- public JsonResult Delete(int id) {
- if (repository.Delete(id)) {
- return Json(new { Status = true }, JsonRequestBehavior.AllowGet);
- }
- return Json(new { Status = false }, JsonRequestBehavior.AllowGet);
- }
Now let's work on views.
- <script src="~/Scripts/jquery-2.0.3.js"></script>
- <script src="~/Scripts/knockout-2.3.0.js"></script>
- <script src='@Url.Content("~/Scripts/knockout-2.3.0.debug.js")' type="text/javascript"></script>
- <script type="text/javascript">
- function EmployeeViewModel() {
- var self = this;
- self.EmployeeID = ko.observable("");
- self.FirstName = ko.observable("");
- self.LastName = ko.observable("");
- self.City = ko.observable("");
- self.Region = ko.observable("");
- self.PostalCode = ko.observable("");
- self.Country = ko.observable("");
-
- var Employee = {
- EmployeeID: self.EmployeeID,
- FirstName: self.FirstName,
- LastName: self.LastName,
- City: self.City,
- Region: self.Region,
- PostalCode: self.PostalCode,
- Country: self.Country
- };
-
- self.Employee = ko.observable();
- self.Employees = ko.observableArray();
-
- $.ajax({
- url: '@Url.Action("GetAllEmployees", "Employee")',
- cache: false,
- type: 'GET',
- contentType: 'application/json; charset=utf-8',
- data: {},
- success: function(data) {
- self.Employees(data);
- }
- });
-
-
- self.create = function() {
- if (Employee.FirstName() != "" && Employee.LastName() != "" && Employee.City() != "" && Employee.Region() != "" && Employee.PostalCode() != "" && Employee.Country() != "") {
- $.ajax({
- url: '@Url.Action("CreateEmployee", "Employee")',
- cache: false,
- type: 'POST',
- contentType: 'application/json; charset=utf-8',
- data: ko.toJSON(Employee),
- success: function(data) {
- self.Employees.push(data);
- self.FirstName("");
- self.LastName("");
- self.City("");
- self.Region("");
- self.PostalCode("");
- self.Country("");
-
- }
- }).fail(
- function(xhr, textStatus, err) {
- alert(err);
- });
-
- } else {
- alert('Please Enter All the Values !!');
- }
-
- }
-
-
- self.delete = function(Employee) {
- if (confirm('Are you sure to Delete "' + Employee.FirstName + '" employee ??')) {
- var id = Employee.EmployeeID;
-
- $.ajax({
- url: '@Url.Action("DeleteEmployee", "Employee")',
- cache: false,
- type: 'POST',
- contentType: 'application/json; charset=utf-8',
- data: ko.toJSON(id),
- success: function(data) {
- self.Employees.remove(Employee);
-
- }
- }).fail(
- function(xhr, textStatus, err) {
- alert(err);
- });
- }
- }
-
-
- self.edit = function(Employee) {
- self.Employee(Employee);
-
- }
-
-
- self.update = function() {
- var Employee = self.Employee();
- alert(Employee.EmployeeID);
-
- debugger;
- $.ajax({
- url: '@Url.Action("EditEmployee", "Employee")',
- cache: false,
- type: 'PUT',
- contentType: 'application/json; charset=utf-8',
- data: ko.toJSON(Employee),
- success: function(data) {
- alert(data);
- self.Employees.removeAll();
- self.Employees(data);
- self.Employee(null);
- alert("Record Updated Successfully");
-
- }
- })
- .fail(
- function(xhr, textStatus, err) {
- alert(err);
- });
- }
-
-
-
- self.reset = function() {
- self.FirstName("");
- self.LastName("");
- self.City("");
- self.Region("");
- self.PostalCode("");
- self.Country("");
- }
-
-
-
- self.cancel = function() {
- self.Employee(null);
-
- }
- }
-
-
-
- $(document).ready(function() {
- var viewModel = new EmployeeViewModel();
- ko.applyBindings(viewModel);
- });
- </script>
- <h3>Employees</h3>
- <table id="empl" data-bind="visible: Employees().length > 0">
- <thead>
- <tr>
- <th>Employee ID</th>
- <th>First Name</th>
- <th>Last Name</th>
- <th>City</th>
- <th>Region</th>
- <th>Postal Code</th>
- <th>Country</th>
- </tr>
- </thead>
- <tbody data-bind="foreach: Employees">
- <tr>
- <td data-bind="text: EmployeeID"></td>
- <td data-bind="text: FirstName"></td>
- <td data-bind="text: LastName"></td>
- <td data-bind="text: City"></td>
- <td data-bind="text: Region"></td>
- <td data-bind="text: PostalCode"></td>
- <td data-bind="text: Country"></td>
- <td>
- <button data-bind="click: $root.edit">Edit</button>
- <button data-bind="click: $root.delete">Delete</button>
- </td>
- </tr>
- </tbody>
- </table>
- <br />
- <div style="border-top: solid 2px #282828; width: 430px; height: 10px"> </div>
- <div data-bind="if: Employee">
- <div>
- <h2>Update Employee</h2>
- </div>
- <div>
- <label for="EmployeeID" data-bind="visible: false">Employee ID</label>
- <label data-bind="text: Employee().EmployeeID, visible: false"></label>
- </div>
- <div>
- <label for="firstname">First Name</label>
- <input data-bind="value: Employee().FirstName" type="text" title="First Name" />
- </div>
- <div>
- <label for="lastname">Last Name</label>
- <input data-bind="value: Employee().LastName" type="text" title="Last Name" />
- </div>
- <div>
- <label for="city">City</label>
- <input data-bind="value: Employee().City" type="text" title="City" />
- </div>
- <div>
- <label for="region">Region</label>
- <input data-bind="value: Employee().Region" type="text" title="Price" />
- </div>
- <div>
- <label for="postalcode">Postal Code</label>
- <input data-bind="value: Employee().PostalCode" type="text" title="PostalCode" />
- </div>
- <div>
- <label for="country">Country</label>
- <input data-bind="value: Employee().Country" type="text" title="Country" />
- </div>
- <br />
- <div>
- <button data-bind="click: $root.update">Update</button>
- <button data-bind="click: $root.cancel">Cancel</button>
- </div>
- </div>
- <div data-bind="ifnot: Employee()">
- <div>
- <h2>Add New Employee</h2>
- </div>
- <div>
- <label for="firstname">First Name</label>
- <input data-bind="value: $root.FirstName" type="text" title="FirstName" />
- </div>
- <div>
- <label for="lastname">Last Name</label>
- <input data-bind="value: $root.LastName" type="text" title="LastName" />
- </div>
- <div>
- <label for="city">City</label>
- <input data-bind="value: $root.City" type="text" title="City" />
- </div>
- <div>
- <label for="region">Region</label>
- <input data-bind="value: $root.Region" type="text" title="Region" />
- </div>
- <div>
- <label for="postalcode">Postal Code</label>
- <input data-bind="value: $root.PostalCode" type="text" title="PostalCode" />
- </div>
- <div>
- <label for="country">Country</label>
- <input data-bind="value: $root.Country" type="text" title="Country" />
- </div>
- <br />
- <div>
- <button data-bind="click: $root.create">Save</button>
- <button data-bind="click: $root.reset">Reset</button>
- </div>
- </div>
Hit F5 to run the application.
Image 1.