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 employees records to display
- 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() {
- // Code to get the list of all the records in database
- return employeeList;
- }
- public Employee Get(int id) {
- // Code to find a record in database
- return employeeList.Find(p => p.EmployeeID == id);
- }
- public Employee Add(Employee item) {
- if (item == null) {
- throw new ArgumentNullException("item");
- }
- // Code to save record into database
- item.EmployeeID = _nextId++;
- employeeList.Add(item);
- return item;
- }
- public bool Update(Employee item) {
- if (item == null) {
- throw new ArgumentNullException("item");
- }
- // Code to update record into database
- 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) {
- // Code to remove the records from database
- 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();
- //
- // GET: /Employee/
- public ActionResult Employee() {
- return View();
- }
- //
- // GET: /Employees/
- public JsonResult GetAllEmployees() {
- return Json(repository.GetAll(), JsonRequestBehavior.AllowGet);
- }
- //
- // GET: /Employee/Create
- public JsonResult CreateEmployee(Employee item) {
- item = repository.Add(item);
- return Json(item, JsonRequestBehavior.AllowGet);
- } //
- // GET: /Employee/Edit/5
- public JsonResult EditEmployee(int EmployeeID, Employee employee) {
- employee.EmployeeID = EmployeeID;
- if (repository.Update(employee)) {
- return Json(repository.GetAll(), JsonRequestBehavior.AllowGet);
- }
- return Json(null);
- }
- //
- // GET: /Employee/Delete/5
- 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);
- }
- });
- //Add New Employee
- 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 !!');
- }
- }
- // Delete employee
- 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);
- // alert("Record Deleted Successfully");
- }
- }).fail(
- function(xhr, textStatus, err) {
- alert(err);
- });
- }
- }
- // Edit employee
- self.edit = function(Employee) {
- self.Employee(Employee);
- }
- //// Update 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); //Put the response in ObservableArray
- self.Employee(null);
- alert("Record Updated Successfully");
- }
- })
- .fail(
- function(xhr, textStatus, err) {
- alert(err);
- });
- }
- // Reset employee
- self.reset = function() {
- self.FirstName("");
- self.LastName("");
- self.City("");
- self.Region("");
- self.PostalCode("");
- self.Country("");
- }
- // Cancel employee
- self.cancel = function() {
- self.Employee(null);
- }
- }
- // Binding knockout
- $(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.

Gowtham RajamanickamPosted Apr 25, 2015, 5:58 AM
good
tomytom mguyenPosted Jul 14, 2014, 12:12 PM
I have CKEDITOR, but i don't know use it, You have guide me how insert database with knockout!Example your "Country" as "Article", I wan use CKEDITOR insert database with knockout? Can you help me?
Ravi ShekharPosted Nov 28, 2013, 9:25 AM
sir can you share this application in attachment here??