CRUD operations on a grid in a Razor page

1 Answer 495 Views
Grid
Dave
Top achievements
Rank 2
Iron
Iron
Dave asked on 03 Jan 2023, 04:16 PM

Hello...

I have a grid on a razor page that shows related data to the main model.  The grid has the usual CRUD operation buttons and there are corresponding post code in the .CS file.  The anti-forgery token is configured and sent with each call back to the server.  The grid is using in-line editing, so nothing custom at all.  I have a Read operation defined, but because I am binding from the server it never gets called (just there for consistency).  This is the grid in the CSHTML page:


@(Html.Kendo().Grid<SettlementHistoryModel>(Model.CoDefendantList)
	.Name("coDefendantGrid")
	.Mobile(MobileMode.Phone)
	.DataSource(ds => ds
		.Ajax()
		.PageSize(30)
		.Events(ev => ev.Error("errorHandler"))
		.Model(m =>
		{
			m.Id(cod => cod.SettlementId);
			m.Field(f => f.SettlementId).Editable(false);
		})
		.Batch(false)
		.Create(c => c.Url("/CaseEdit?handler=NewCoDefendant").Data("forgeryToken"))
		.Read(r => r.Url("/CaseEdit?handler=ReadCoDefendant").Data("forgeryToken"))
		.Update(u => u.Url("/CaseEdit?handler=UpdateCoDefendant").Data("forgeryToken"))
		.Destroy(d => d.Url("/CaseEdit?handler=DeleteCoDefendant").Data("forgeryToken"))
		.ServerOperation(false)
	)
	.Pageable()
	.Sortable(s => s
		.AllowUnsort(true)
		.SortMode(GridSortMode.Mixed)
		.ShowIndexes(true)
	)
	.ToolBar(tb => tb.Create())
	.Editable(ed => ed.Mode(GridEditMode.InLine))
	.Scrollable(s => s.Enabled(true).Height("auto"))
	.Columns(c =>
	{
		c.Command(c =>
		{
			c.Edit();
			c.Destroy();
		}).Width("15%").HtmlAttributes(new { style = "vertical-align: top;"}).Title("Actions");
		c.Bound(res => res.SettlementId).Title("ID").Width("5%");
		c.Bound(res => res.CaseId).Title("Case").Width("5%");
		c.Bound(res => res.Codefendant).Title("Co-Defendant").Width("15%");
		c.Bound(res => res.Settlement).Title("Settlement").Format("{0:c2}").Width("10%");
		c.Bound(res => res.SettlementDate).Title("Settlement Date").Format("{0:MM/dd/yyyy}").Width("10%");
		c.Bound(res => res.Comments).Title("Comments").Encoded(false);
	})
	.ColumnMenu(m => m
		.ComponentType("modern")
		.Columns(cm => cm.Sort("asc")))
	.Reorderable(r => r.Columns(true))
	.Resizable(rs => rs.Columns(true)))


Ok, so data populates in the grid with no problem and the appropriate Add, Edit and Delete buttons appear where they should.  The appropriate post method is called.  Here, for example, is the Update method:


public JsonResult OnPostUpdateCoDefendant(SettlementHistoryModel settlement, [DataSourceRequest] DataSourceRequest request)
{
	// Check for a valid object
	if (settlement != null)
	{
		//_context.SettlementHistories.Update(settlement);
		//_context.SaveChanges();
	}

	// And return the JSON for the object
	return new JsonResult(new[] { settlement }.ToDataSourceResult(request, ModelState));
}

The problem?  When this method is hit, the SettlementHistoryModel object is not null, but all of the properties of the singular object ARE null (except the SettlementId, which is 0).  It doesn't matter how the grid gets the data (server binding or Read action), which order the items are in the method signature, etc.  The method is called, but ultimately the operation will fail because there is nothing in the SettlementHistoryModel object.

I've downloaded the grid demo and that seems to work.  My code is pretty much exactly the same as the demo code, yet there is no way I have tried that gets my code working.

What am I missing?

Dave
Top achievements
Rank 2
Iron
Iron
commented on 03 Jan 2023, 05:15 PM

Additional information:

I think the object is not making it to the server because the main bound object (the parent table where SettlementHistory described above is a related table) is not valid.  I didn't notice this because I stopped on a break point on the server side when I saw the object was null.  Going back to the browser triggered the onError JS code which said 5 required fields in that model were not supplied.

Weird thing is that the grid sits outside of the form where this other bound object is located.  With the SettlementHistory object explicitly part of the method signature and the place where the grid lives, I would have expected the main model state would not play into this at all.  Apparently ASP.NET thinks otherwise.

1 Answer, 1 is accepted

Sort by
0
Mihaela
Telerik team
answered on 06 Jan 2023, 08:56 AM | edited on 06 Jan 2023, 08:57 AM

Hello Dave,

Thank you for the provided details.

I would suggest binding the Grid to a separate view model that contains only the properties that should be displayed in the Grid and then updating the respective Model server-side, when a specified record is edited.

 

Regards, Mihaela Progress Telerik

Love the Telerik and Kendo UI products and believe more people should try them? Invite a fellow developer to become a Progress customer and each of you can get a $50 Amazon gift voucher.

Tags
Grid
Asked by
Dave
Top achievements
Rank 2
Iron
Iron
Answers by
Mihaela
Telerik team
Share this question
or