Child Grid Not Passing Correct Id to Controller

3 posts, 1 answers
  1. Shuja
    Shuja avatar
    30 posts
    Member since:
    Mar 2011

    Posted 19 May 2014 Link to this post

    Hi

    I'm using the latest Q1 2014 commercial updtaes for the UI toolkit.
    I have a standard Parent-Child Kendo Grid where i can add and update a record in the parent and i wanted to do the same in the child grid. The parent grid worked fine but i couldn't get the child grid to insert a record. The code is as follows:

    view:
    <div style="width:800px;font-size:x-small; padding-top:40px;">
     
     
    @(Html.Kendo().Grid<DRS2014.Models.PathAccountCode>()
            .Name("GridRules")
            .Columns(columns =>
            {
                columns.Bound(e => e.Id);
                columns.Bound(e => e.Debtors_Account_Code).Title("Debtors<br/>Account<br/>Code");
                columns.Bound(e => e.Email).Width(100);
                columns.Bound(e => e.EmailConfirmed).Title("Email<br/>Confirmed?").Width(40);
                columns.Bound(e => e.BackingReportFormat).Title("Report<br/>Format");
                columns.Bound(e => e.BackingReportType).Title("Report<br/>Type");
                columns.Bound(e => e.InvoiceType).Title("Invoice<br/>Type");
                columns.Command(command => { command.Edit().Text(" "); }).Width(80);
            })              
            .Sortable()
            .Pageable()
            //.Scrollable()
            .ClientDetailTemplateId("detailsTemplate")
            //.HtmlAttributes(new { style = "height:430px;" })
            .DataSource(dataSource => dataSource
                .Ajax()
                .Model(m=>m.Id(p=>p.Id))
                .PageSize(10)
                .Read(read => read.Action("GetPathAccounts", "Admin")) 
                .Create(create=>create.Action("InsertPathAccount","Admin"))
                .Update(update=>update.Action("UpdatePathAccount","Admin"))
                .Destroy(delete=>delete.Action("DeletePathAccount","Admin"))         
            )       
            .Events(e=>e.Edit("onEdit"))
            .ToolBar(commands=>commands.Create())
            .Editable(editable=>editable
            .Mode(GridEditMode.PopUp))
            .Filterable()
    )
     
     
        <br />
     
     
    </div>
     
    <script id="detailsTemplate" type="text/kendo-tmpl">
       
     
        @(Html.Kendo().Grid<DRS2014.Models.PathAccountCust>()
            .Name("Data_#=Id#")
            //.Events(e=>e.Edit("onEdit2"))
            .Columns(columns=>
                {
                    columns.Bound(o => o.CustGlobalCode);
                    columns.Bound(o => o.CustName);
                    columns.Bound(o => o.CustLocation);
                    columns.Command(command => { command.Edit().Text(" "); });
                })
                 
            .ToolBar(commands=>commands.Create())
            .Editable(editable=>editable
            .Mode(GridEditMode.PopUp))
                 
            .DataSource(dataSource=>dataSource
            .Ajax()
        //    .Aggregates(agg=>
        //{
        //    agg.Add(p => p.Apportionment).Sum();
     
        //})
            .Model(m=>m.Id(x=>x.Id))
            //.Events(events => events.Error("error"))
            .PageSize(10)
             
             
            .Read(read=>read.Action("GetPathAccountCust","Admin", new { Id = "#= Id #" }))
            .Create(create=>create.Action("InsertPathAccountCust","Admin", new { Id = "#= Id #" }))
            .Update(update=>update.Action("UpdatePathAccountCust","Admin"))
            .Destroy(delete=>delete.Action("DeletePathAccountCust","Admin"))
             
          
            )
             
             //.Pageable(p=>p.Refresh(true))
            .Sortable()
            .ToClientTemplate())
     
     
        </script>


    Controller:
    public ActionResult InsertPathAccountCust([DataSourceRequest] DataSourceRequest request, Models.PathAccountCust newAccountCust, int Id)
    {
        try
        {
            newAccountCust.AccountNoId = Id;
            _PriceRepository.insertPathAccountCodeCust(newAccountCust);
     
            return Json(new[] { newAccountCust }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("ERR1", ex.Message);
     
            return Json(ModelState.ToDataSourceResult(), JsonRequestBehavior.AllowGet);
        }
     
    }

    When i break in the controller, the Id value is always 0. 
    I checked in fiddler and it seems the view is passing back a value correctly as i can see the Id in there.

    I tried many variations on this but could not get this to work at all.
    However, I saw that both the parent and child grid had a primary key "Id" so i decided to test the system by changing the parent code to "pId".

    View:
    <div style="width:800px;font-size:x-small; padding-top:40px;">
     
     
    @(Html.Kendo().Grid<DRS2014.Models.PathAccountCode>()
            .Name("GridRules")
            .Columns(columns =>
            {
                columns.Bound(e => e.pId);
                columns.Bound(e => e.Debtors_Account_Code).Title("Debtors<br/>Account<br/>Code");
                columns.Bound(e => e.Email).Width(100);
                columns.Bound(e => e.EmailConfirmed).Title("Email<br/>Confirmed?").Width(40);
                columns.Bound(e => e.BackingReportFormat).Title("Report<br/>Format");
                columns.Bound(e => e.BackingReportType).Title("Report<br/>Type");
                columns.Bound(e => e.InvoiceType).Title("Invoice<br/>Type");
                columns.Command(command => { command.Edit().Text(" "); }).Width(80);
            })              
            .Sortable()
            .Pageable()
            //.Scrollable()
            .ClientDetailTemplateId("detailsTemplate")
            //.HtmlAttributes(new { style = "height:430px;" })
            .DataSource(dataSource => dataSource
                .Ajax()
                .Model(m=>m.Id(p=>p.pId))
                .PageSize(10)
                .Read(read => read.Action("GetPathAccounts", "Admin")) 
                .Create(create=>create.Action("InsertPathAccount","Admin"))
                .Update(update=>update.Action("UpdatePathAccount","Admin"))
                .Destroy(delete=>delete.Action("DeletePathAccount","Admin"))         
            )       
            .Events(e=>e.Edit("onEdit"))
            .ToolBar(commands=>commands.Create())
            .Editable(editable=>editable
            .Mode(GridEditMode.PopUp))
            .Filterable()
    )
     
     
        <br />
     
     
    </div>
     
    <script id="detailsTemplate" type="text/kendo-tmpl">
       
     
        @(Html.Kendo().Grid<DRS2014.Models.PathAccountCust>()
            .Name("Data_#=pId#")
            //.Events(e=>e.Edit("onEdit2"))
            .Columns(columns=>
                {
                    columns.Bound(o => o.CustGlobalCode);
                    columns.Bound(o => o.CustName);
                    columns.Bound(o => o.CustLocation);
                    columns.Command(command => { command.Edit().Text(" "); });
                })
                 
            .ToolBar(commands=>commands.Create())
            .Editable(editable=>editable
            .Mode(GridEditMode.PopUp))
                 
            .DataSource(dataSource=>dataSource
            .Ajax()
        //    .Aggregates(agg=>
        //{
        //    agg.Add(p => p.Apportionment).Sum();
     
        //})
            .Model(m=>m.Id(x=>x.Id))
            //.Events(events => events.Error("error"))
            .PageSize(10)
             
             
            .Read(read=>read.Action("GetPathAccountCust","Admin", new { pId = "#= pId #" }))
            .Create(create=>create.Action("InsertPathAccountCust","Admin", new { pId = "#= pId #" }))
            .Update(update=>update.Action("UpdatePathAccountCust","Admin"))
            .Destroy(delete=>delete.Action("DeletePathAccountCust","Admin"))
             
          
            )
             
             //.Pageable(p=>p.Refresh(true))
            .Sortable()
            .ToClientTemplate())
     
     
        </script>

    Controller:
    public ActionResult InsertPathAccountCust([DataSourceRequest] DataSourceRequest request, Models.PathAccountCust newAccountCust, int pId)
    {
        try
        {
            newAccountCust.AccountNoId = pId;
            _PriceRepository.insertPathAccountCodeCust(newAccountCust);
     
            return Json(new[] { newAccountCust }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("ERR1", ex.Message);
     
            return Json(ModelState.ToDataSourceResult(), JsonRequestBehavior.AllowGet);
        }
     
    }

    THIS WORKS! Just changing the parent primary Key to pId in the database and then changing all the references of this Id to "pId" allows the child grid to add and update records and the controller receives the correct Id passing to it.
    But the question is why? Your examples have demos with both parent and child primary keys as "Id" and i have a colleague who has developed a similar parent-child grid and he uses "Id" in both tables too yet the kendo grid insert works for him.

    My route config is:
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

    I don't really want to be modifying my table primary key names so please could you let me know if i have missed something or whether there is a different problem with this grid setup that i've tried to implement?

    Thank you,

    Shuja

     



     
  2. Answer
    Petur Subev
    Admin
    Petur Subev avatar
    1882 posts

    Posted 21 May 2014 Link to this post

    Hello Shuja,

    The only issue that I can think off is that the name of the fields for both the parent and the child Grid is the same (let's say they are both 'ID'). Then on the server side you will receive same value for both cases, you should use different field names for the way of the transport (not need to change the model).

    .Create(create=>create.Action("InsertPathAccountCust","Admin", new { parentId= "#= Id #" }))

    Also you will have to change the name of the argument inside your action method. 

    Kind Regards,
    Petur Subev
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
  3. UI for ASP.NET MVC is VS 2017 Ready
  4. Shuja
    Shuja avatar
    30 posts
    Member since:
    Mar 2011

    Posted 21 May 2014 in reply to Petur Subev Link to this post

    Thank you!
    That seems to work. Changed the name of the parent Id parameter being passed to the controller and named the parameter exactly the same in the Action and it works!
Back to Top