or
@(Html.Kendo().Map() .Name("map") .Center(39.50, -98.35) .Zoom(3) .Layers(x => { x.Add().Type(MapLayerType.Tile).UrlTemplateId("http://tile.openstreetmap.org/#= zoom #/#= x #/#= y #.png"); x.Add().Type(MapLayerType.Shape) .Style(y => y.Fill(z => z.Color("#000000").Opacity(1))) .DataSource(y => y.GeoJson().Read(z => z.Action(MVC.MyController.Map()))); }) .Events(events => events .ShapeCreated("onShapeCreated") ))<script> function onShapeCreated(e) { alert('shape!'); }</script>public virtual ActionResult Map(){ List<Tuple<double, double>> coordinates = new List<Tuple<double,double>>(){ new Tuple<double, double>(39.50, -98.35), new Tuple<double, double>(30.268107, -97.744821) }; JObject featureCollection = new JObject( new JProperty("type", "FeatureCollection"), new JProperty("features", new JArray( new JObject( new JProperty("type", "Feature"), new JProperty("properties", new JObject()), new JProperty("geometry", new JObject( new JProperty("type", "MultiPoint"), new JProperty("coordinates", coordinates.Select(c => new JArray(c.Item1, c.Item2)).ToArray()) )) ) )) ); ContentResult result = new ContentResult(); result.Content = featureCollection.ToString(); result.ContentType = "application/json"; return result;}{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "MultiPoint", "coordinates": [ [ 39.5, -98.35 ], [ 30.268107, -97.744821 ] ] } } ]}<script> $(document).ready(function () { $("#grid").kendoGrid({ dataSource: { data: itemData(50), pageSize: 12, change: function(e) { var item = e.items[0]; console.log(item.get("gridActionPlan.gridActionPlanID")); } }, height: 475, groupable: true, navigatable: true, sortable: true, filterable: true, resizable: true, columnMenu: true, pageable: true, toolbar: ["save", "cancel"], columns: [ { field: "gridActionPlanID", values: actionPlanValues, title: "Action Plan", width: 200 }, { field: "gridNewRetailSP", title: "New Retail SP", width: 120 }, { field: "gridPercentEffectedStock", title: "% of Effected Stock", width: 150 }, { field: "gridSales", title: "Sales", width: 150 }, { field: "gridNetImpact", title: "Net Impact", width: 150 }], editable: true }); }); function itemData(count) { var data = []; for (var i = 0; i < count; i++) { data.push({ gridActionPlanID : 0, gridActionPlan : { gridActionPlanID : 0, gridActionPlanName : "[Select Action Plan]" }, gridNewRetailSP : 0, gridPercentEffectedStock : 0, gridSales : 0, gridNetImpact : 0 }); } return data; } var actionPlanValues = [{ "value": 0, "text": "[Select Action Plan]" },{ "value": 1, "text": "SP Adjustment / Display" },{ "value": 2, "text": "Clearances" },{ "value": 3, "text": "Return to Supplier" },{ "value": 4, "text": "Inter-Store Transfer" },{ "value": 5, "text": "Seasonal Import or Local" },{ "value": 6, "text": "Bar Code Problem" },{ "value": 7, "text": "Waste" },{ "value": 8, "text": "Stock Problem" },{ "value": 9, "text": "Display Piece" },{ "value": 10, "text": "Color / Size / Range" }];</script>{ "odata.error":{ "code":"","message":{ "lang":"en-US","value":"The request is invalid." },"innererror":{ "message":"patch : Invalid JSON. A token was not recognized in the JSON content.\r\n","type":"","stacktrace":"" } }}models=%7B%22Id%22%3A1026%2C%22Title%22%3A%22Test+Company+test%22%7D01.public class Company {02. public Company() { }03. 04. public Company(Company company) {05. this.Id = company.Id;06. this.Title = company.Title;07. this.Projects = company.Projects;08. }09. 10. public int Id { get; set; }11. public string Title { get; set; }12. 13. public virtual ICollection<Project> Projects { get; set; }14.}001.public class CompanyController : ODataController002.{003. private ApplicationDbContext db = new ApplicationDbContext();004. 005. // GET odata/Company006. [Queryable]007. public IQueryable<Company> GetCompany()008. {009. return db.Companies;010. }011. 012. // GET odata/Company(5)013. [Queryable]014. public SingleResult<Company> GetCompany([FromODataUri] int key)015. {016. return SingleResult.Create(db.Companies.Where(company => company.Id == key));017. }018. 019. // PUT odata/Company(5)020. public async Task<IHttpActionResult> Put([FromODataUri] int key, Company company)021. {022. if (!ModelState.IsValid)023. {024. return BadRequest(ModelState);025. }026. 027. if (key != company.Id)028. {029. return BadRequest();030. }031. 032. db.Entry(company).State = EntityState.Modified;033. 034. try035. {036. await db.SaveChangesAsync();037. }038. catch (DbUpdateConcurrencyException)039. {040. if (!CompanyExists(key))041. {042. return NotFound();043. }044. else045. {046. throw;047. }048. }049. 050. return Updated(company);051. }052. 053. // POST odata/Company054. public async Task<IHttpActionResult> Post(Company company)055. {056. if (!ModelState.IsValid)057. {058. return BadRequest(ModelState);059. }060. 061. db.Companies.Add(company);062. await db.SaveChangesAsync();063. 064. return Created(company);065. }066. 067. // PATCH odata/Company(5)068. [AcceptVerbs("PATCH", "MERGE")]069. public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Company> patch)070. {071. if (!ModelState.IsValid)072. {073. return BadRequest(ModelState);074. }075. 076. Company company = await db.Companies.FindAsync(key);077. if (company == null)078. {079. return NotFound();080. }081. 082. patch.Patch(company);083. 084. try085. {086. await db.SaveChangesAsync();087. }088. catch (DbUpdateConcurrencyException)089. {090. if (!CompanyExists(key))091. {092. return NotFound();093. }094. else095. {096. throw;097. }098. }099. 100. return Updated(company);101. }102. 103. // DELETE odata/Company(5)104. public async Task<IHttpActionResult> Delete([FromODataUri] int key)105. {106. Company company = await db.Companies.FindAsync(key);107. if (company == null)108. {109. return NotFound();110. }111. 112. db.Companies.Remove(company);113. await db.SaveChangesAsync();114. 115. return StatusCode(HttpStatusCode.NoContent);116. }117. 118. // GET odata/Company(5)/Projects119. [Queryable]120. public IQueryable<Project> GetProjects([FromODataUri] int key)121. {122. return db.Companies.Where(m => m.Id == key).SelectMany(m => m.Projects);123. }124. 125. protected override void Dispose(bool disposing)126. {127. if (disposing)128. {129. db.Dispose();130. }131. base.Dispose(disposing);132. }133. 134. private bool CompanyExists(int key)135. {136. return db.Companies.Count(e => e.Id == key) > 0;137. }138.}001.<h2>Company List</h2>002. 003.<div id="company-data">004. <div class="col-md-3 col-sm-5 col-xs-5">005. <div id="company-list" style="padding: 0px; height: 500px; overflow: auto" data-role="listview" data-template="list-template" data-bind="source: companies, events: {change: OnSelect}" data-selectable="true"></div>006. <div>007. <button class="btn btn-success btn-sm" id="btn-add-company"><span class="glyphicon glyphicon-plus"></span> Add</button>008. <button class="btn btn-danger btn-sm" id="btn-delete-company" data-bind="visible: hasSelection, click: deleteSelection"><span class="glyphicon glyphicon-remove"></span> Delete</button>009. <button class="btn btn-default btn-sm" id="btn-clear-company" data-bind="visible: hasSelection, click: clearSelection"><span class="glyphicon glyphicon-ban-circle"></span> Clear</button>010. <button class="btn btn-primary btn-sm btn-block" id="btn-save" data-bind="visible: hasChanges, click: saveChanges"><span class="glyphicon glyphicon-cloud-upload"></span> Save All</button>011. </div>012. </div>013. <div class="col-md-9 col-sm-7 col-xs-7" data-bind="visible: hasSelection">014. <label for="company-title">Title:</label><br />015. <input id="company-title" data-bind="value: selectedItem.Title" ><br />016. </div>017.</div>018. 019.<script type="text/x-kendo-template" id="list-template">020. <div class="company" style="cursor: pointer">021. <span data-bind="text: Title"></span>022. </div>023.</script>024. 025.<script>026. $(function () {027. var firstSync = true;028. var companyVM = new kendo.observable({029. // Data Source.030. companies: new kendo.data.DataSource({031. type: 'odata',032. transport: {033. create: {034. url: '/odata/Company',035. dataType: 'json',036. type: 'POST'037. },038. read: {039. url: '/odata/Company',040. dataType: 'json'041. },042. update: {043. url: function (data) {044. return '/odata/Company(' + data.Id + ')';045. },046. dataType: 'json',047. type: 'PATCH'048. },049. destroy: {050. url: function (data) {051. return '/odata/Company(' + data.Id + ')';052. },053. dataType: 'json',054. type: 'DELETE'055. },056. parameterMap: function (options, operation) {057. if (operation !== "read" && options) {058. console.log(operation + '*: ' + kendo.stringify(options));059. return {060. models: kendo.stringify(options)061. };062. }063. console.log(operation + ': ' + kendo.stringify(options));064. return options;065. }066. },067. schema: {068. data: function (data) {069. return data['value'];070. },071. total: function (data) {072. return data['odata.count'];073. },074. model: {075. id: 'Id',076. fields: {077. Title: { type: 'string' }078. }079. }080. },081. change: function () {082. // We don't want to fire the first time the data loads because that counts as changed.083. if (!firstSync)084. companyVM.set('hasChanges', true);085. else086. firstSync = false;087. }088. }),089. 090. // Properties.091. selectedItem: null,092. hasSelection: function () {093. return this.get('selectedItem') != null;094. },095. hasChanges: false,096. 097. // Functions.098. clearSelection: function() {099. this.set('selectedItem', null);100. $('#company-list').getKendoListView().clearSelection();101. },102. saveChanges: function() {103. this.companies.sync();104. this.set('hasChanges', false);105. },106. deleteSelection: function () {107. if (confirm('Warning, deletion is permanent! Are you sure you wish to delete this item?')) {108. this.companies.remove(this.selectedItem);109. this.set('hasChanges', true);110. this.clearSelection();111. }112. },113. 114. // Events.115. OnSelect: function (e) {116. var list = $(e.sender.element).getKendoListView();117. var row = list.select();118. var item = list.dataSource.getByUid(row.data('uid'));119. 120. this.set('selectedItem', item);121. }122. });123. 124. kendo.bind($('#company-data'), companyVM);125. });126.</script>