Could someone provide an example of how to use ClientDataSource in an ASP.NET WebForms environment?
e.g. with PageMethods which pass data back to the client for usage in, say, a combobox?
All the examples I see online deal with MVC or Web Service configurations and do not provide adequate documentation on how to use in a legacy webforms environment.
4 Answers, 1 is accepted
Hi Michael,
The way RadClientDataSource interacts with a WebService is very similar to how it would with PageMethods. You will need to prepare the environment for PageMethods. See Pagemethods in asp.net and Calling ASP.Net AJAX PageMethods using ScriptManager Example articles for example.
Once you have the methods you can call them similar to the example from ClientDataSource - Integration with RadGrid.
Kind regards,
Attila Antal
Progress Telerik
Our thoughts here at Progress are with those affected by the outbreak.
I use PageMethods and jquery ajax calls quite regularly in applications, but I cannot determine how to properly configure the client data source to accomplish the same thing.
For example:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
<
telerik:RadStyleSheetManager
ID
=
"RadStyleSheetManager1"
runat
=
"server"
/>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
telerik:RadScriptManager
ID
=
"RadScriptManager1"
runat
=
"server"
EnablePageMethods
=
"True"
>
<
Scripts
>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.Core.js"
/>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.jQuery.js"
/>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.jQueryInclude.js"
/>
</
Scripts
>
</
telerik:RadScriptManager
>
<
telerik:RadAjaxManager
ID
=
"RadAjaxManager1"
runat
=
"server"
/>
<
div
>
<
telerik:RadGrid
runat
=
"server"
ID
=
"RadGrid1"
ClientDataSourceID
=
"RadClientDataSource1"
>
<
MasterTableView
>
<
PagerStyle
Mode
=
"NextPrevNumericAndAdvanced"
></
PagerStyle
>
<
CommandItemSettings
/>
<
Columns
>
<
telerik:GridBoundColumn
DataField
=
"ID"
UniqueName
=
"ID"
/>
<
telerik:GridBoundColumn
DataField
=
"Name"
UniqueName
=
"Name"
/>
<
telerik:GridBoundColumn
DataField
=
"Description"
UniqueName
=
"Description"
/>
</
Columns
>
</
MasterTableView
>
</
telerik:RadGrid
>
<
telerik:RadClientDataSource
ID
=
"RadClientDataSource1"
runat
=
"server"
>
<
DataSource
>
<
WebServiceDataSourceSettings
BaseUrl
=
"Default.aspx/"
>
<
Select
Url
=
"GetItems"
DataType
=
"JSON"
/>
</
WebServiceDataSourceSettings
>
</
DataSource
>
<
Schema
>
<
Model
ID
=
"id"
>
<
telerik:ClientDataSourceModelField
FieldName
=
"id"
DataType
=
"Number"
/>
<
telerik:ClientDataSourceModelField
FieldName
=
"name"
DataType
=
"String"
/>
<
telerik:ClientDataSourceModelField
FieldName
=
"description"
DataType
=
"String"
/>
</
Model
>
</
Schema
>
</
telerik:RadClientDataSource
>
</
div
>
</
form
>
</
body
>
</
html
>
using System;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Script.Services;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public class Item
{
public Int32 id { get; set; }
public String name { get; set; }
public String description { get; set; }
}
[WebMethod]
[ScriptMethod]
public static List<
Item
> GetItems()
{
List<
Item
> results = new List<
Item
>();
for (Int32 idx = 0; idx < 100; idx++)
{
results.Add(new Item() {id = idx, name = "Name " + idx, description = "Description " + idx});
}
return results;
}
}
does not work. The grid is rendered but the server-side GetItems method is never executed.
To complicate matters, I am not sure how you actually define the clientdatasource, since the results from a pagemethod are wrapped in a d element
I see in the comboBox example this seems to be addressed but there is no backup to support the example of what its calling.
If I try to add a "<Schema DataName="d.results">" definition in my code, I get a javascript error when I execute.
Hi Michael,
Thank you for the code provided!
There are a few things that I have noticed as possible causes for the described behavior. I would suggest you try to apply the following changes to the code snippet from your message:
- DataField of the GridBoundColumn should match the FieldName of a DataSource field. The names are case sensitive strings:
<telerik:GridBoundColumn DataField="id" UniqueName="ID" /> <telerik:GridBoundColumn DataField="name" UniqueName="Name" /> <telerik:GridBoundColumn DataField="description" UniqueName="Description" />
- ContentType and RequestType properties should be set in the WebServiceDataSourceSettings
<Select Url="GetItems" DataType="JSON" ContentType="application/json; charset=utf-8" RequestType="Post" />
- Set the Schema DataName to "d":
<Schema DataName="d">
Please try my suggestion and let me know how it goes!
Kind regards,
Doncho
Progress Telerik
Our thoughts here at Progress are with those affected by the outbreak.
Thanks Doncho... #2 seemed to be the key to get the server-side function called. #3 got the data back correctly, and #1 got the grid to display.
For people who may be in a similar situation, here is a working example, which also uses a custom parameter to populate the grid.
I haven't played around with passing data for CRUD operations, but I imagine the process would be similar
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
>
<
head
runat
=
"server"
>
<
title
></
title
>
<
telerik:RadStyleSheetManager
ID
=
"RadStyleSheetManager1"
runat
=
"server"
/>
<
telerik:RadCodeBlock
runat
=
"server"
ID
=
"RadCodeBlock_Default"
>
<
script
language
=
"javascript"
type
=
"text/javascript"
>
function parameterMap(sender, args) {
if (args.get_type() == "read" && args.get_data()) {
var start = $find("<%= RadNumericTextBox1.ClientID %>").get_value();
var jsonData = { 'start': start };
args.set_parameterFormat(kendo.stringify(jsonData));
}
}
function RadNumericTextBox1_ValueChanged(sender, eventArgs) {
$find("<%= RadGrid1.ClientID %>").get_masterTableView().rebind();
}
</
script
>
</
telerik:RadCodeBlock
>
</
head
>
<
body
>
<
form
id
=
"form1"
runat
=
"server"
>
<
telerik:RadNumericTextBox
runat
=
"server"
ID
=
"RadNumericTextBox1"
Value
=
"0"
DisplayText
=
"0"
>
<
ClientEvents
OnValueChanged
=
"RadNumericTextBox1_ValueChanged"
></
ClientEvents
>
</
telerik:RadNumericTextBox
>
<
telerik:RadScriptManager
ID
=
"RadScriptManager1"
runat
=
"server"
EnablePageMethods
=
"True"
>
<
Scripts
>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.Core.js"
/>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.jQuery.js"
/>
<
asp:ScriptReference
Assembly
=
"Telerik.Web.UI"
Name
=
"Telerik.Web.UI.Common.jQueryInclude.js"
/>
</
Scripts
>
</
telerik:RadScriptManager
>
<
telerik:RadAjaxManager
ID
=
"RadAjaxManager1"
runat
=
"server"
/>
<
div
>
<
telerik:RadGrid
runat
=
"server"
ID
=
"RadGrid1"
ClientDataSourceID
=
"RadClientDataSource1"
>
<
MasterTableView
AutoGenerateColumns
=
"False"
>
<
PagerStyle
Mode
=
"NextPrevNumericAndAdvanced"
></
PagerStyle
>
<
CommandItemSettings
/>
<
Columns
>
<
telerik:GridBoundColumn
DataField
=
"id"
UniqueName
=
"ID"
/>
<
telerik:GridBoundColumn
DataField
=
"name"
UniqueName
=
"Name"
/>
<
telerik:GridBoundColumn
DataField
=
"description"
UniqueName
=
"Description"
/>
</
Columns
>
</
MasterTableView
>
<
ClientSettings
>
<
ClientEvents
></
ClientEvents
>
</
ClientSettings
>
</
telerik:RadGrid
>
<
telerik:RadClientDataSource
ID
=
"RadClientDataSource1"
runat
=
"server"
>
<
ClientEvents
OnCustomParameter
=
"parameterMap"
/>
<
DataSource
>
<
WebServiceDataSourceSettings
BaseUrl
=
"Default.aspx/"
>
<
Select
Url
=
"GetItems"
DataType
=
"JSON"
ContentType
=
"application/json; charset=utf-8"
RequestType
=
"Post"
></
Select
>
</
WebServiceDataSourceSettings
>
</
DataSource
>
<
Schema
DataName
=
"d"
>
<
Model
ID
=
"id"
>
<
telerik:ClientDataSourceModelField
FieldName
=
"id"
DataType
=
"Number"
/>
<
telerik:ClientDataSourceModelField
FieldName
=
"name"
DataType
=
"String"
/>
<
telerik:ClientDataSourceModelField
FieldName
=
"description"
DataType
=
"String"
/>
</
Model
>
</
Schema
>
</
telerik:RadClientDataSource
>
</
div
>
</
form
>
</
body
>
</
html
>
using System;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Script.Services;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public class Item
{
public Int32 id { get; set; }
public String name { get; set; }
public String description { get; set; }
}
[WebMethod]
[ScriptMethod]
public static List<
Item
> GetItems(Int32 start)
{
List<
Item
> results = new List<
Item
>();
for (Int32 idx = start; idx < start+100; idx++)
{
results.Add(new Item() {id = idx, name = "Name " + idx, description = "Description " + idx});
}
return results;
}
}