Please visit DEMANDDRAFT.SHOP for quality of products...

Ad

Search This Blog

Monday, October 27, 2014

Simplest knockoutJS and MVC4 demo

Introduction 

This is a C# MVC web project with Knockout JS at its bare minimum. It only contains MVC 4, KnockoutJS 3.0, and jQuery 2.0.3 . Irrelevant packages are not added.

Background  

I have been searching for the most simplistic example of MVC knockout web project. But unfortunately I could not find any. Most of the examples are loaded with irrelevant extras.  So I ended up spending a day writing and wiring up this simple demo. Feel free to download it.
The ingredients of this project are:
  1. Microsoft MVC 4.0  
  2. KnockoutJS 3.0 - its backward compatible with 2.2.0
  3. jQuery 2.0.3. - should be compatible with jQuery 1.7
This project strive to be the most simplistic example of MVC-KnockoutJS wire up with the least number of files, so I intentionally not having the following:
  • No Entity Framework  (yes, you can have MVC without EF) 
  • No KnockoutJS Mapping package.
  • No irrelevant jQuery packages (jQueryUI, jQuery validation) 
  • No CSS  
  • No bundling nor modularizing.
  • No Modernizr  
  • No support for old browsers.  I use Chrome for developing this. 
  • No Injection container

Using the code  

This project using MVC4 "Empty" project template and written from the ground up. Only 3 files are manually written: 
Model\Person.cs
namespace KnockoutJsonDemo.Models
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
Controller\HomeController.cs
using System.Web.Mvc;
using KnockoutJsonDemo.Models;
using Newtonsoft.Json;

namespace KnockoutJsonDemo.Controllers
{
public class HomeController : Controller
{
private static Person _data = new Person()
{
Name = "PersonName",
Age = 25
};

public ActionResult Index()
{
return View();
}

public ActionResult TestJson()
{
return Json(new
{
Name = "MyName",
Age = "17"
}, JsonRequestBehavior.AllowGet);
}

public JsonResult GetPerson()
{
return Json(_data, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public JsonResult UpdatePerson()
{
string jsonString = Request.Form[0];
Person person = JsonConvert.DeserializeObject<Person>(jsonString);
_data.Name = person.Name;
_data.Age = person.Age;
return Json(_data);
}

}
}
View\Home\Index.cshtml . This is equipped with knockoutJS.
@{
ViewBag.Title = "KnockoutJs client";
}

<h2>KnockoutJs client</h2>

<div>
<p>Name: <input data-bind='value: displayName' /></p>
<p>Age: <input data-bind='value: displayAge' /></p>
<p>Name Age: <input data-bind='value: displayNameAge' /></p>
<button data-bind='click: loadFromServer'>Load From Server</button>
</div>

<div>
<h2>Input</h2>
<p>Input Name: <input data-bind='value: inputName' /></p>
<p>Input Age: <input data-bind='value: inputAge' /></p>
<button data-bind='click: updateLocal'>Update Local</button>
<button data-bind='click: updateServer'>Update Server</button>
</div>

<div>
<h2>KO Content</h2>
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
</div>

<script src="~/Scripts/jquery-2.0.3.js"></script>
<script src="~/Scripts/knockout-3.0.0.js"></script>
<script type="text/javascript">
var PersonViewModel = function(name, age) {
var self = this;
self.displayName = ko.observable(name);
self.displayAge = ko.observable(age);
self.displayNameAge = ko.computed(function() {
return self.displayName() + " age " + self.displayAge();
}, self);

self.inputName = ko.observable("My Name");
self.inputAge = ko.observable("15");
self.updateLocal = function() {
self.displayName(self.inputName());
self.displayAge(self.inputAge());
};

self.loadFromServer = function () {
$.getJSON("/home/GetPerson", function (data) {
self.updateThis(data);
});
};

self.updateServer = function() {
var data = "{ \"name\" : \"" + self.inputName() +
"\", \"age\" : \"" + self.inputAge() + "\"}";
console.log(data);
$.post("/home/UpdatePerson", data, function(returnedData) {
self.updateThis(returnedData);
}, "json");
};

self.updateThis = function(jsonData) {
var jsonString = JSON.stringify(jsonData);
var parsed = JSON.parse(jsonString);
self.displayName(parsed.Name);
self.displayAge(parsed.Age);
};
};
var myViewModel = new PersonViewModel("Jay Tan", "21");
ko.applyBindings(myViewModel); // This makes Knockout get to work
</script>
I hope this small demo will help you. If you can make this example simpler, please let me know. Feedback is appreciated.

Source from
http://www.codeproject.com/Tips/701995/Simplest-knockoutJS-and-MVC-demo

No comments:

Post a Comment