Hello,
I have a kendo grid in my MVC application. I have a viewmodel that shows related data in the grid, when the user edits a row using inline editing I need it to update the database via the viewmodel. How is this done?
My grid code
@(Html.Kendo().Grid<Multiple_Table_Post.ViewModels.MultiPostViewModel>() .Name("Grid") .Columns(columns => { columns.Bound(c => c.id).Title("ID"); columns.Bound(c => c.parent_id).Title("PID"); columns.Bound(c => c.vessel_name).Title("Name") .ClientTemplate("<a href='" + Url.Action("Details", "Vessels") + "/#=parent_id#'" + ">#=vessel_name#</a>"); columns.Bound(c => c.vessel_location).Title("Location"); columns.Bound(c => c.vessel_mmsi).Title("MMSI"); columns.Bound(c => c.vessel_bhp).Title("BHP"); columns.Bound(c => c.vessel_omid).Title("OMID"); columns.Command(command => { command.Edit() .Text("Edit") .UpdateText("Update") .CancelText("Cancel"); }).Width(110); } ) .Pageable() .Editable(editable => editable.Mode(GridEditMode.InLine)) .DataSource(dataSource => dataSource .Ajax() .PageSize(7) .Read(read => read.Action("data_read", "InlineEdit")) .Update(update => update.Action("data_update", "InlineEdit")) .Sort(sort => sort.Add("id").Descending()) .Model(model => { model.Id(p => p.id); }) ) )The viewmodel
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Web;using Multiple_Table_Post.Models;namespace Multiple_Table_Post.ViewModels{ public class MultiPostViewModel { // #Vessel public int id { get; set; } [Display(Name = "Name [Vessels(table)]")] [Required(ErrorMessage = "Vessel name cannot be left blank")] public string vessel_name { get; set; } [Required(ErrorMessage = "Location cannot be left blank")] [Display(Name = "Location [Vessels(table)]")] [UIHint("LocationEditor")] public string vessel_location { get; set; } [Display(Name = "MMSI [Vessels(table)]")] public string vessel_mmsi { get; set; } // #Vessel Details // Without primary key ID. [Display(Name = "OMID [Vessels Details(table)]")] public Nullable<System.DateTime> vessel_omid { get; set; } [Display(Name = "BHP [Vessels Details(table)]")] [Required(ErrorMessage = "BHP cannot be left blank")] public Nullable<decimal> vessel_bhp { get; set; } [Display(Name = "PID [Vessels Details(table)]")] public Nullable<int> parent_id { get; set; } [Display(Name = "DECK [Vessels Details(table)]")] public Nullable<decimal> vessel_deck { get; set; } public virtual ICollection<vessel_details> vessel_details { get; set; } }}Controll
public ActionResult data_read([DataSourceRequest]DataSourceRequest request) { var datacontext = db.vessel_details.AsQueryable(); IQueryable<MultiPostViewModel> thevessel = from c in datacontext select new MultiPostViewModel { id = c.id, parent_id = c.vessel.id, vessel_name = c.vessel.vessel_name, vessel_location = c.vessel.vessel_location, vessel_mmsi = c.vessel.vessel_mmsi, vessel_omid = c.vessel_omid, vessel_bhp = c.vessel_bhp, }; DataSourceResult result = thevessel.ToDataSourceResult(request); return Json(result); }Controller : UPDATE Grid Data
[AcceptVerbs(HttpVerbs.Post)]public ActionResult data_update([DataSourceRequest]DataSourceRequest request, VesselsViewModel vessel){ if (ModelState.IsValid) { var entity = new vessel(); entity.id = vessel.id; entity.vessel_name = vessel.vessel_name; entity.vessel_location = vessel.vessel_location; entity.vessel_mmsi = vessel.vessel_mmsi; db.vessels.Attach(entity); db.Entry(entity).State=EntityState.Modified; db.SaveChanges(); } return Json(new[] { vessel }.ToDataSourceResult(request, ModelState));}
Thanks
