Hello
I am currently trying out Kendo UI for jQuery. I have an issue with the combobox where it does not save a new item to my database once I added the item. It seems to save it in localstorage for the duration of the session. I am new to this, so I am probably doing something wrong here. I have followed the example from the demo and the backend service. Can someone please tell me what I am doing wrong here.
Here is the code for my view page which sits in my app:
<div id="countries"> <div class="demo-section k-content"> <h4>Enter a Country name</h4> <input id="countries" style="width: 100%;" /> <div class="demo-hint">e.g. 'South Africa'</div> </div> <script id="noDataTemplate" type="text/x-kendo-tmpl"> <div> No data found. Do you want to add new item - '#: instance.text() #' ? </div> <br /> <button class="k-button" onclick="addNew('#: instance.element[0].id #', '#: instance.text() #')">Add new item</button> </script> <script> function addNew(widgetId, value) { var widget = $("#" + widgetId).getKendoComboBox(); var dataSource = widget.dataSource; if (confirm("Are you sure you want to add this Country?")) { dataSource.add({ CountryIdentifier: 0, CountryName: value }); dataSource.one("sync", function () { widget.select(dataSource.view().length - 1); }); dataSource.sync(); } }; </script> <script> $(document).ready(function () { var crudServiceBaseUrl = "http://localhost:49517"; var dataSource = new kendo.data.DataSource({ batch: true, transport: { read: { url: crudServiceBaseUrl + "/Countries", dataType: "jsonp" }, create: { url: crudServiceBaseUrl + "/Countries/Create", dataType: "jsonp" }, parameterMap: function (options, operation) { if (operation !== "read" && options.models) { return { models: kendo.stringify(options.models) }; } } }, schema: { model: { id: "CountryIdentifier", fields: { CountryIdentifier: { type: "number" }, CountryName: { type: "string" } } } } }); $("#countries").kendoComboBox({ filter: "startswith", dataTextField: "CountryName", dataValueField: "CountryIdentifier", dataSource: dataSource, noDataTemplate: $("#noDataTemplate").html() }); }); </script> </div>
Here is the code for my controller which sits in my API:
public class CountriesController : Controller { public ActionResult Index() { return this.Jsonp(CountryRepository.All()); } public JsonResult Update() { var models = this.DeserializeObject<IEnumerable<CountryViewModel>>("models"); if (models != null) { CountryRepository.Update(models); } return this.Jsonp(models); } public ActionResult Destroy() { var countries = this.DeserializeObject<IEnumerable<CountryViewModel>>("models"); if (countries != null) { CountryRepository.Delete(countries); } return this.Jsonp(countries); } public ActionResult Create() { var countries = this.DeserializeObject<IEnumerable<CountryViewModel>>("models"); if (countries != null) { CountryRepository.Insert(countries); } return this.Jsonp(countries); } public JsonResult Read(int skip, int take) { IEnumerable<CountryViewModel> result = CountryRepository.All().OrderByDescending(p => p.CountryIdentifier); result = result.Skip(skip).Take(take); return this.Jsonp(result); } }
Here is the code for my ViewModel which sits in my API:
public class CountryViewModel { public int? CountryIdentifier { get; set; } public string CountryName { get; set; } public string CreatedBy { get; set; } public string FK_CreatedByID { get; set; } [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public Nullable<System.DateTime> DateCreated { get; set; } public string LastEditedBy { get; set; } public string FK_LastEditedByID { get; set; } [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public Nullable<System.DateTime> DateLastEdited { get; set; } }
And here is the code for my CountryRepository which sits in my API:
public static class CountryRepository { public static IList<CountryViewModel> All() { var result = HttpContext.Current.Session["Countries"] as IList<CountryViewModel>; if (result == null) { HttpContext.Current.Session["Countries"] = result = new OldMutualDataContext().Countries.Select(c => new CountryViewModel { CountryIdentifier = c.CountryIdentifier, CountryName = c.CountryName, CreatedBy = c.CreatedBy, FK_CreatedByID = c.FK_CreatedByID, DateCreated = c.DateCreated, LastEditedBy = c.LastEditedBy, FK_LastEditedByID = c.FK_LastEditedByID, DateLastEdited = c.DateLastEdited }).ToList(); } return result; } public static CountryViewModel One(Func<CountryViewModel, bool> predicate) { return All().FirstOrDefault(predicate); } public static void Insert(CountryViewModel country) { var first = All().OrderByDescending(c => c.CountryIdentifier).FirstOrDefault(); if (first != null) { country.CountryIdentifier = first.CountryIdentifier + 1; } else { country.CountryIdentifier = 0; } All().Insert(0, country); } public static void Insert(IEnumerable<CountryViewModel> countries) { foreach (var country in countries) { Insert(country); } } public static void Update(CountryViewModel country) { var target = One(c => c.CountryIdentifier == country.CountryIdentifier); if (target != null) { target.CountryName = country.CountryName; target.LastEditedBy = country.LastEditedBy; target.FK_LastEditedByID = country.FK_LastEditedByID; target.DateLastEdited = country.DateLastEdited; } } public static void Update(IEnumerable<CountryViewModel> countries) { foreach (var country in countries) { Update(country); } } public static void Delete(CountryViewModel country) { var target = One(c => c.CountryIdentifier == country.CountryIdentifier); if (target != null) { All().Remove(target); } } public static void Delete(IEnumerable<CountryViewModel> countries) { foreach (var country in countries) { Delete(country); } } }
Help would be appreciated.
Thank You