diff --git a/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/data-binding/remote-data.md b/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/data-binding/remote-data.md
index f41bb56b95..1bdea41b55 100644
--- a/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/data-binding/remote-data.md
+++ b/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/data-binding/remote-data.md
@@ -698,4 +698,61 @@ On remote data binding, all grid actions such as paging, sorting, editing, group
{% highlight c# tabtitle="Offline.cs" %}
{% include code-snippet/grid/data-binding/offline/offline.cs %}
{% endhighlight %}
-{% endtabs %}
\ No newline at end of file
+{% endtabs %}
+
+## Fetch result from the DataManager query using external button
+
+By default, Syncfusion ASP.NET MVC Grid automatically binds a remote data source using the `DataManager`. However, in some scenarios, you may need to fetch data dynamically from the server using a query triggered by an external button. This approach allows greater control over when and how data is loaded into the Grid.
+
+To achieve this, you can use the `executeQuery` method of `DataManager` with a `Query` object. This method allows you to run a custom query and retrieve results dynamically.
+
+The following example demonstrates how to fetch data from the server when an external button is clicked and display a status message indicating the data fetch status:
+
+{% tabs %}
+{% highlight razor tabtitle="CSHTML" %}
+
+@using Syncfusion.EJ2
+
+
+@Html.EJS().Button("fetchButton").Content("Execute Query").CssClass("e-primary").Render()
+
+@Html.EJS().Grid("Grid").Columns(col =>
+{
+ col.Field("OrderID").HeaderText("Order ID").Width("120").TextAlign(Syncfusion.EJ2.Grids.TextAlign.Right).Type("number").Add();
+ col.Field("CustomerID").HeaderText("Customer ID").Width("160").Type("string").Add();
+ col.Field("EmployeeID").HeaderText("Employee ID").Width("120").TextAlign(Syncfusion.EJ2.Grids.TextAlign.Right).Type("number").Add();
+ col.Field("Freight").HeaderText("Freight").Width("150").Format("C2").TextAlign(Syncfusion.EJ2.Grids.TextAlign.Right).Type("number").Add();
+ col.Field("ShipCountry").HeaderText("Ship Country").Width("150").Type("string").Add();
+}).Render()
+
+
+
+
+{% endhighlight %}
+{% endtabs %}
+
+
\ No newline at end of file
diff --git a/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/editing/validation.md b/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/editing/validation.md
index 978aec6d7c..1c397c4fba 100644
--- a/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/editing/validation.md
+++ b/ej2-asp-core-mvc/grid/EJ2_ASP.MVC/editing/validation.md
@@ -1,6 +1,6 @@
---
layout: post
-title: Validation in ##Platform_Name## Grid Component
+title: Validation in ##Platform_Name## Grid Control | Syncfusion
description: Learn here all about Validation in Syncfusion ##Platform_Name## Grid component of Syncfusion Essential JS 2 and more.
platform: ej2-asp-core-mvc
control: Validation
@@ -8,7 +8,7 @@ publishingplatform: ##Platform_Name##
documentation: ug
---
-# Validation in ASP.NET MVC Grid component
+# Validation in ASP.NET MVC Syncfusion Grid component
Validation is a crucial aspect of data integrity in any application. The ASP.NET MVC Grid component in Syncfusion® provides built-in support for easy and effective data validation. This feature ensures that the data entered or modified adheres to predefined rules, preventing errors and guaranteeing the accuracy of the displayed information.
@@ -120,3 +120,217 @@ Here's an example that demonstrates how to change the position of the validation

+## Show custom error message while performing CRUD actions
+
+While performing CRUD actions in the Syncfusion ASP.NET MVC Grid, errors may occur due to various reasons such as validation failures, network issues, or server-side exceptions. Handling these errors effectively is essential for providing meaningful error messages when an operation fails.
+
+To achieve this, you can use the [ActionFailure](https://help.syncfusion.com/cr/aspnetmvc-js2/Syncfusion.EJ2.Grids.Grid.html#Syncfusion_EJ2_Grids_Grid_ActionFailure) event, which is triggered when an action (such as update, delete, or insert) fails. This event allows you to retrieve the error message from the server response and display it in the UI.
+
+The following sample demonstrates how to retrieve and display error messages in the Syncfusion ASP.NET MVC Grid:
+
+{% tabs %}
+{% highlight razor tabtitle="CSHTML" %}
+
+@*Replace xxxx with your actual port number*@
+@Html.EJS().Grid("grid").DataSource(ds => ds.Url("https://localhost:xxxx/Grid/UrlDatasource")
+ .InsertUrl("https://localhost:xxxx/Grid/Insert")
+ .UpdateUrl("https://localhost:xxxx/Grid/Update")
+ .RemoveUrl("https://localhost:xxxx/Grid/Remove")
+ .Adaptor("UrlAdaptor")).Columns(col =>
+{
+ col.Field("OrderID").HeaderText("Order ID").IsPrimaryKey(true).Width("150")
+ .TextAlign(Syncfusion.EJ2.Grids.TextAlign.Right).Add();
+ col.Field("CustomerID").HeaderText("Customer Name").Width("150").Add();
+ col.Field("Freight").HeaderText("Freight").Width("150").Format("C2")
+ .TextAlign(Syncfusion.EJ2.Grids.TextAlign.Right).Add();
+ col.Field("ShipCity").HeaderText("Ship City").Width("150").Add();
+}).EditSettings(edit => edit.AllowAdding(true).AllowEditing(true).AllowDeleting(true)).Toolbar(new List
+{ "Add", "Edit", "Delete", "Update", "Cancel" }).Height(320).ActionFailure("actionFailure").AllowPaging(true).Render()
+
+
+
+{% endhighlight %}
+
+{% highlight c# tabtitle="GridController.cs" %}
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Web.Mvc;
+using Syncfusion.EJ2.Base;
+using UrlAdaptor.Models;
+
+namespace UrlAdaptor.Controllers
+{
+ public class GridController : Controller
+ {
+ private static List order = OrdersDetails.GetAllRecords();
+ ///
+ /// Handles the HTTP POST request to retrieve data from the data source based on the DataManagerRequest.
+ /// Supports filtering,searching, sorting, and paging operations (skip and take).
+ ///
+ /// Contains the filtering, sorting, and paging options requested by the client.
+ /// Returns the filtered,searched, sorted, and paginated data along with the total record count.
+ [HttpPost]
+ public ActionResult UrlDatasource(DataManagerRequest dataManager)
+ {
+ // Retrieve data source and convert to queryable.
+ IEnumerable DataSource = order;
+
+ // Initialize DataOperations instance.
+ DataOperations queryableOperation = new DataOperations();
+
+ // Handling searching operation.
+ if (dataManager.Search != null && dataManager.Search.Count > 0)
+ {
+ DataSource = queryableOperation.PerformSearching(DataSource, dataManager.Search);
+ }
+
+ // Handling filtering operation.
+ if (dataManager.Where != null && dataManager.Where.Count > 0)
+ {
+ foreach (var condition in dataManager.Where)
+ {
+ foreach (var predicate in condition.predicates)
+ {
+ DataSource = queryableOperation.PerformFiltering(DataSource, dataManager.Where, predicate.Operator);
+ }
+ }
+ }
+
+ // Handling sorting operation.
+ if (dataManager.Sorted != null && dataManager.Sorted.Count > 0)
+ {
+ DataSource = queryableOperation.PerformSorting(DataSource, dataManager.Sorted);
+ }
+
+ // Get the total count of records.
+ int totalRecordsCount = DataSource.Count();
+
+ // Handling paging operation.
+ if (dataManager.Skip != 0)
+ {
+ DataSource = queryableOperation.PerformSkip(DataSource, dataManager.Skip);
+ }
+ if (dataManager.Take != 0)
+ {
+ DataSource = queryableOperation.PerformTake(DataSource, dataManager.Take);
+ }
+
+ // Return result and total record count.
+ return dataManager.RequiresCounts ? Json(new { result = DataSource, count = totalRecordsCount }) : Json(DataSource);
+ }
+
+ ///
+ /// Inserts a new data item into the data collection.
+ ///
+ /// It contains the new record detail which is need to be inserted.
+ /// Returns void.
+ [HttpPost]
+ [Route("Grid/Insert")]
+ public ActionResult Insert(CRUDModel newRecord)
+ {
+ if (newRecord != null)
+ {
+ var existingOrder = order.FirstOrDefault(or => or.OrderID == newRecord.value.OrderID);
+ if (existingOrder == null)
+ {
+ order.Insert(0, newRecord.value);
+ return Json(new { success = true, message = "Order added successfully.", data = newRecord });
+ }
+ else
+ {
+ return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Duplicate values cannot be inserted.");
+ }
+ }
+ return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid data received.");
+ }
+
+ ///
+ /// Update a existing data item from the data collection.
+ ///
+ /// It contains the updated record detail which is need to be updated.
+ /// Returns void.
+ [HttpPost]
+ [Route("Grid/Update")]
+ public ActionResult Update(CRUDModel updateRecord)
+ {
+ if (updateRecord.value == null)
+ {
+ return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid data received.");
+ }
+
+ // Corrected condition to validate OrderID range.
+ if (updateRecord.value.OrderID < 10010 || updateRecord.value.OrderID > 10030)
+ {
+ return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "OrderID must be between 10010 and 10030 to update.");
+ }
+ var data = OrdersDetails.GetAllRecords().FirstOrDefault(or => or.OrderID == updateRecord.value.OrderID);
+ if (data == null)
+ {
+ return new HttpStatusCodeResult(HttpStatusCode.NotFound, "Order not found.");
+ }
+
+ // Update the existing record.
+ data.CustomerID = updateRecord.value.CustomerID;
+ data.Freight = updateRecord.value.Freight;
+ data.ShipCity = updateRecord.value.ShipCity;
+ data.ShipCountry = updateRecord.value.ShipCountry;
+ return Json(new { success = true, message = "Order updated successfully.", data = updateRecord });
+ }
+ ///
+ /// Remove a specific data item from the data collection.
+ ///
+ /// It contains the specific record detail which is need to be removed.
+ /// Returns void.
+ [HttpPost]
+ [Route("Grid/Remove")]
+ public ActionResult Remove(CRUDModel value)
+ {
+ int orderId = int.Parse(value.key.ToString());
+ if (orderId < 10031 || orderId > 10045)
+ {
+ return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "OrderID must be between 10031 and 10045 to delete.");
+ }
+ var data = OrdersDetails.GetAllRecords().FirstOrDefault(orderData => orderData.OrderID == orderId);
+ OrdersDetails.GetAllRecords().Remove(data);
+ return Json(new { success = true, message = "Order deleted successfully." });
+ }
+ }
+ public class CRUDModel
+ {
+ public string action { get; set; }
+ public string keyColumn { get; set; }
+ public object key { get; set; }
+ public T value { get; set; }
+ public List Added { get; set; }
+ public List Changed { get; set; }
+ public List Deleted { get; set; }
+ public IDictionary @params { get; set; }
+ }
+}
+
+{% endhighlight %}
+{% endtabs %}
+
+
\ No newline at end of file
diff --git a/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/data-binding/remote-data.md b/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/data-binding/remote-data.md
index 1ad469e933..4e7eb4d590 100644
--- a/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/data-binding/remote-data.md
+++ b/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/data-binding/remote-data.md
@@ -671,44 +671,70 @@ The following code example demonstrates how to export all records on the client
{% endhighlight %}
{% endtabs %}
-## Sending additional parameters to the server
-
-The Syncfusion ASP.NET Core Grid component allows you to include custom parameters in data requests. This feature is particularly useful when you need to provide additional information to the server enhanced processing.
-
-By utilizing the `query` property of the Grid along with the `addParams` method of the **Query** class, you can easily incorporate custom parameters into data requests for every Grid action.
-
-To enable custom parameters in data requests for the Grid, follow these steps:
-
-**1. Bind the Query Object to the Grid**: Assign the initialized query object to the `query` property of the Grid.
-
-**2. Initialize the Query Object:** Create a new instance of the **Query** class and use the `addParams` method to add the custom parameters.
-
-**3. Handle Data State Changes:** If you need to dynamically update the data based on interactions, implement the [dataStateChange](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Grids.Grid.html#Syncfusion_EJ2_Grids_Grid_DataStateChange) event handler to execute the query with the updated state.
-
-**4. Execute Data Request:** In the service, execute the data request by combining the custom parameters with other query parameters such as paging and sorting.
+## Offline mode
-The following example demonstrates how to send additional parameters to the server:
+On remote data binding, all grid actions such as paging, sorting, editing, grouping, filtering, etc, will be processed on server-side. To avoid post back for every action, set the grid to load all data on initialization and make the actions process in client-side. To enable this behavior, use the `Offline` property of `e-data-manager` tag helper.
{% tabs %}
{% highlight cshtml tabtitle="CSHTML" %}
-{% include code-snippet/grid/data-binding/remote-prams/tagHelper %}
+{% include code-snippet/grid/data-binding/offline/tagHelper %}
{% endhighlight %}
-{% highlight c# tabtitle="remotedata.cs" %}
-{% include code-snippet/grid/data-binding/remote-prams/custombindingcore.cs %}
+{% highlight c# tabtitle="Offline.cs" %}
+{% include code-snippet/grid/data-binding/offline/offline.cs %}
{% endhighlight %}
{% endtabs %}
-
+## Fetch result from the DataManager query using external button
-## Offline mode
+By default, Syncfusion ASP.NET Core Grid automatically binds a remote data source using the `DataManager`. However, in some scenarios, you may need to fetch data dynamically from the server using a query triggered by an external button. This approach allows greater control over when and how data is loaded into the Grid.
-On remote data binding, all grid actions such as paging, sorting, editing, grouping, filtering, etc, will be processed on server-side. To avoid post back for every action, set the grid to load all data on initialization and make the actions process in client-side. To enable this behavior, use the `Offline` property of `e-data-manager` tag helper.
+To achieve this, you can use the `executeQuery` method of `DataManager` with a `Query` object. This method allows you to run a custom query and retrieve results dynamically.
+
+The following example demonstrates how to fetch data from the server when an external button is clicked and display a status message indicating the data fetch status:
{% tabs %}
{% highlight cshtml tabtitle="CSHTML" %}
-{% include code-snippet/grid/data-binding/offline/tagHelper %}
-{% endhighlight %}
-{% highlight c# tabtitle="Offline.cs" %}
-{% include code-snippet/grid/data-binding/offline/offline.cs %}
+
+@page
+@model IndexModel
+
+
+
{% endhighlight %}
-{% endtabs %}
\ No newline at end of file
+{% endtabs %}
+
+
\ No newline at end of file
diff --git a/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/editing/validation.md b/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/editing/validation.md
index 3b8e4e8cc4..8fd666ff43 100644
--- a/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/editing/validation.md
+++ b/ej2-asp-core-mvc/grid/EJ2_ASP.NETCORE/editing/validation.md
@@ -8,8 +8,7 @@ publishingplatform: ##Platform_Name##
documentation: ug
---
-
-# Validation in ASP.NET Core Grid component
+# Validation in ASP.NET Core Syncfusion Grid component
Validation is a crucial aspect of data integrity in any application. The ASP.NET Core Grid component in Syncfusion® provides built-in support for easy and effective data validation. This feature ensures that the data entered or modified adheres to predefined rules, preventing errors and guaranteeing the accuracy of the displayed information.
@@ -121,3 +120,221 @@ Here's an example that demonstrates how to change the position of the validation

+## Show custom error message while performing CRUD actions
+
+While performing CRUD actions in the Syncfusion ASP.NET Core Grid, errors may occur due to various reasons such as validation failures, network issues, or server-side exceptions. Handling these errors effectively is essential for providing meaningful error messages when an operation fails.
+
+To achieve this, you can use the [ActionFailure](https://help.syncfusion.com/cr/aspnetcore-js2/Syncfusion.EJ2.Grids.Grid.html#Syncfusion_EJ2_Grids_Grid_ActionFailure) event, which is triggered when an action (such as update, delete, or insert) fails. This event allows you to retrieve the error message from the server response and display it in the UI.
+
+The following sample demonstrates how to retrieve and display error messages in the Syncfusion ASP.NET Core Grid:
+
+{% tabs %}
+{% highlight cshtml tabtitle="CSHTML" %}
+@page
+@model IndexModel
+
+
+
+ //Replace xxxx with your actual port number
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endhighlight %}
+
+{% highlight cs tabtitle="GridController.cs" %}
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Syncfusion.EJ2.Base;
+using UrlAdaptor.Models;
+
+namespace UrlAdaptor.Controllers
+{
+ [ApiController]
+ public class GridController : Controller
+ {
+ [HttpPost]
+ [Route("api/[controller]")]
+ public object Post([FromBody] DataManagerRequest DataManagerRequest)
+ {
+ // Retrieve data from the data source (e.g., database).
+ IQueryable DataSource = GetOrderData().AsQueryable();
+
+ // Initialize DataOperations instance.
+ QueryableOperation queryableOperation = new QueryableOperation();
+
+ // Handling searching operation.
+ if (DataManagerRequest.Search != null && DataManagerRequest.Search.Count > 0)
+ {
+ DataSource = queryableOperation.PerformSearching(DataSource, DataManagerRequest.Search);
+ }
+
+ // Handling filtering operation.
+ if (DataManagerRequest.Where != null && DataManagerRequest.Where.Count > 0)
+ {
+ foreach (var condition in DataManagerRequest.Where)
+ {
+ foreach (var predicate in condition.predicates)
+ {
+ DataSource = queryableOperation.PerformFiltering(DataSource, DataManagerRequest.Where, predicate.Operator);
+ }
+ }
+ }
+
+ // Handling sorting operation.
+ if (DataManagerRequest.Sorted != null && DataManagerRequest.Sorted.Count > 0)
+ {
+ DataSource = queryableOperation.PerformSorting(DataSource, DataManagerRequest.Sorted);
+ }
+
+ // Get the total count of records.
+ int totalRecordsCount = DataSource.Count();
+
+ // Handling paging operation.
+ if (DataManagerRequest.Skip != 0)
+ {
+ DataSource = queryableOperation.PerformSkip(DataSource, DataManagerRequest.Skip);
+ }
+ if (DataManagerRequest.Take != 0)
+ {
+ DataSource = queryableOperation.PerformTake(DataSource, DataManagerRequest.Take);
+ }
+
+ // Return data based on the request.
+ return new { result = DataSource, count = totalRecordsCount };
+ }
+
+ [HttpGet]
+ [Route("api/[controller]")]
+ public List GetOrderData()
+ {
+ var data = OrdersDetails.GetAllRecords().ToList();
+ return data;
+ }
+
+ ///
+ /// Inserts a new data item into the data collection.
+ ///
+ /// The order to be inserted.
+ /// It returns the newly inserted record detail.
+ [HttpPost]
+ [Route("api/[controller]/Insert")]
+ public IActionResult Insert([FromBody] CRUDModel value)
+ {
+ if (value == null)
+ {
+ return BadRequest(new { message = "Invalid data received." });
+ }
+ var existingOrder = OrdersDetails.order.FirstOrDefault(or => or.OrderID == value.value.OrderID);
+ if (existingOrder == null)
+ {
+ OrdersDetails.order.Insert(0, value.value);
+ return Ok(new { success = true, message = "Order added successfully.", data = value });
+ }
+ else
+ {
+ return BadRequest(new { success = false, message = "Duplicate values cannot be inserted." });
+ }
+ }
+
+ ///
+ /// Updates an existing order.
+ ///
+ /// The updated order details.
+ /// It returns the updated order details.
+ [HttpPost]
+ [Route("api/[controller]/Update")]
+ public IActionResult Update([FromBody] CRUDModel Order)
+ {
+ var updatedOrder = Order.value;
+
+ if (updatedOrder.OrderID < 10010 || updatedOrder.OrderID > 10030)
+ {
+ return BadRequest(new { message = "OrderID must be between 10010 and 10030 to update." });
+ }
+
+ var data = OrdersDetails.GetAllRecords().FirstOrDefault(or => or.OrderID == updatedOrder.OrderID);
+ if (data == null)
+ {
+ return NotFound(new { message = "Order not found." });
+ }
+
+ // Update the existing record.
+ data.CustomerID = updatedOrder.CustomerID;
+ data.ShipCity = updatedOrder.ShipCity;
+ data.ShipCountry = updatedOrder.ShipCountry;
+ return Ok(new { success = true, message = "Order updated successfully." });
+ }
+
+ ///
+ /// Deletes an order.
+ ///
+ /// It contains the specific record detail which is need to be removed.
+ /// It returns the deleted record detail.
+ [HttpPost]
+ [Route("api/[controller]/Remove")]
+ public IActionResult Remove([FromBody] CRUDModel value)
+ {
+ int orderId;
+ if (!int.TryParse(value.key.ToString(), out orderId))
+ {
+ return BadRequest(new { message = "Invalid OrderID format." });
+ }
+
+ if (orderId < 10031 || orderId > 10045)
+ {
+ return BadRequest(new { message = "OrderID must be between 10031 and 10045 to delete." });
+ }
+
+ var data = OrdersDetails.GetAllRecords().FirstOrDefault(orderData => orderData.OrderID == orderId);
+ if (data == null)
+ {
+ return NotFound(new { message = "Order not found." });
+ }
+
+ OrdersDetails.GetAllRecords().Remove(data);
+ return Ok(new { success = true, message = "Order deleted successfully." });
+ }
+
+ public class CRUDModel where T : class
+ {
+ public string? action { get; set; }
+ public string? keyColumn { get; set; }
+ public object? key { get; set; }
+ public T? value { get; set; }
+ public List? added { get; set; }
+ public List? changed { get; set; }
+ public List? deleted { get; set; }
+ public IDictionary? @params { get; set; }
+ }
+ }
+}
+
+{% endhighlight %}
+{% endtabs %}
+
+
\ No newline at end of file
diff --git a/ej2-asp-core-mvc/grid/images/databinding/fetch-data.png b/ej2-asp-core-mvc/grid/images/databinding/fetch-data.png
new file mode 100644
index 0000000000..7f38dc74a3
Binary files /dev/null and b/ej2-asp-core-mvc/grid/images/databinding/fetch-data.png differ
diff --git a/ej2-asp-core-mvc/grid/images/editing/custom-message.png b/ej2-asp-core-mvc/grid/images/editing/custom-message.png
new file mode 100644
index 0000000000..61bdba0e40
Binary files /dev/null and b/ej2-asp-core-mvc/grid/images/editing/custom-message.png differ