Click here to Skip to main content
Click here to Skip to main content

Callback & Controls Rendering (Manually Partial Page Rendering)

, 18 Jan 2008 CPOL
Rate this:
Please Sign up or sign in to vote.
Callback is lightweight technique used to call server side methods asynchronously from javascript without any postback and reloading/rendering of unnecessary parts of page and unnecessary code

Callback & Controls Rendering (Manually Partial Page Rendering)

In my previous article, I wrote about Callback and JSON based Javascript serialization which you can find here.

1. Why Should I read this article

As Callback doesn’t cause postback and page rendering neither full nor even partial. We can communicate with server (IIS) and our server side code runs there successfully and could rebind our controls like Dropdownlist, Gridview, Listview, Datalist, Repeater or any server side control to which you assign data but problem is when page wont render, its controls wont render and if controls wont render then changes wont reflect and when changes wont reflect there wont be anything at front end to show on webpage.

Article is mainly about Callback and Rendering Controls but through this tutorial you can also learn many other things like brief introduction of Postback, Rendering, Create server side controls dynamically, Create Datatable dynamically in memory to bind with create server side controls means binding, get server side control at client side and set their properties and registering client side event of server side control from/through server side code.

First of all, I would like to brief some terms which I believe every web developer should aware of.

2. Postback

Postback is a mechanism of communication between client-side (browser) and server-side (IIS). Through postback all contents of page/form(s) sent to the server from client for processing and after following page life cycle all server side contents get render into client side code and client (browser) display that contents. Callback is another way of communication between server and client. Callback doesn’t follow the page life cycle which followed by in standard postback and doesn’t even cause Rendering.

3. Rendering

Rendering is process of converting server side code/contents into client side code/content so client (browser) can understand that code and could display the output. Browser can understand or you may say decode code of client side languages and scripts like HTML, DHTML, XHTML, Javascript, Vbscript and a long list.

If rendering wont happen then changes won’t reflect which happens on server at client side. Ajax leverages partial postback automatically whereas callback doesn’t cause, so programmer needs to perform that task manually.

ASP.NET team has created RenderControl method with its each control so by using that control we can render our control very easily.

If you have read my previous article you may skip following section from 4 and 5.

4. CALLBACK

CALLBACK is lightweight process, It uses well known xmlhttp object internally to call server side method, it doesn’t cause page postback so doesn’t cause page rendering so we to show output at client side we need to make output html ourselves and render controls manually.

5. ICALLBACKEVENTHANDLER

ICALLBACK implemented in asp.net by using ICALLBACKEVENTHANDLER interface has two methods, one of them used to be call from javascript (client side code) and other one return result asynchronously back to javascript function.

We just need to perform some action through server side code at server side and needs to return results but results could are in instance or object of any class which could be not easy for javascript code to handle easily so here we prefer JSON which stands for Javascript Object Notation.

7. Real Time Scenario with implementation

Suppose we have categories, subcategories, products data and needs to populate categories and subcategories which depend upon categories data would be populate in two different dropdownlists. For products data which is multicolumn and we need to show that data in tabular format so I would prefer Gridview control.

So the situation would be load/populate categories on Page_Load and load/populate subcategories on the basis of selected category using callback and finally load products into Gridview on the basis of selected subcategory.

Before starting coding, I would like to write Pseudo code for better understanding.

8. Pseudo Code

1. Create Server side controls e.g. Dropdownlists and Gridview

2. Load Categories on Page load

3. Implement ICallbackEventHandler interface

4. Create subcategories data in server memory to bind to Subcategory dropdownlist.

5. Render control (subcategory dropdownlist) and show output.

6. Create products data in server memory to bind to Products gridview.

7. Render Control (products gridview) and return rendered contents to client side to show

8. Set innerHTML of each control by rendered contents

CREATE CONTROLS (DROPDOWNLISTS, GRIDVIEW)

<b>Categories:</b>

<br />

<asp:DropDownList ID="ddlCategories" runat="server" Width="100" onchange="CallSrv(this);">

</asp:DropDownList>

<br />

<b>Subcategories</b>:

<div id="ddlSubcategories">

</div>

<b>Products:</b>

<div id="grvProducts">

</div>

CALLBACK SERVER SIDE CODE

Let’s implement ICALLBACKEVENTHANDLER to call server side method asynchronously step by step J

Implement Server Side (C#) Page/Control class by System.Web.UI.ICallbackEventHandler

Following are definition of two methods which needs to implement:

RaiseCallbackEvent method invoke by javascript function

public void RaiseCallbackEvent(string eventArgument)

{

//split eventArgument parameter to get command name and then value to perform operation

//like if command is by Category then we need to load sub categories and if command is by subcateogry

//then we need to load products

string[] commands = eventArgument.Split(",".ToCharArray());

//check command

if (commands[0].Equals("LoadSubCategory"))

{

//create sub category control dynamically

DropDownList ddlSubcategories = new DropDownList();

switch (commands[1])

{

//populate sub category data on the basis of category

case "Autos":

ddlSubcategories.Items.Add("Cars");

ddlSubcategories.Items.Add("Bikes");

break;

case "Electronics":

ddlSubcategories.Items.Add("Computers");

ddlSubcategories.Items.Add("TV");

break;

}

//set client side event

ddlSubcategories.Attributes.Add("onchange", "CallSrv(this);");

//primarily rendered output would come in string builder (sb) object

//through stringwriter which would get data from htmltextwriter

//which would get data from RenderControl method

System.Text.StringBuilder sb = new System.Text.StringBuilder();

System.IO.StringWriter sw = new System.IO.StringWriter(sb);

HtmlTextWriter htw = new HtmlTextWriter(sw);

//render sub categories dropdownlist

ddlSubcategories.RenderControl(htw);

//set prefix command name so at client side we could know which control to load actually and

//set rendered string

this.RenderedOutput = "LoadSubCategory," + sb.ToString();

}

//check command

else if (commands[0].Equals("LoadProducts"))

{

//create data table in memory and populate that wid sample/example data to show on webpage

DataTable dtProducts = new DataTable();

//create columns of data table

dtProducts.Columns.Add("ProductName");

dtProducts.Columns.Add("ProductDescription");

dtProducts.Columns.Add("ProductPrice");

//declare row to fill up with data

DataRow drProduct;

switch (commands[1])

{

//create data in memory (datatable) to populate in gridview

case "Cars":

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Honda";

drProduct["ProductDescription"] = "2000 CC";

drProduct["ProductPrice"] = "$1000";

dtProducts.Rows.Add(drProduct);

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Toyota";

drProduct["ProductDescription"] = "1800 CC";

drProduct["ProductPrice"] = "$800";

dtProducts.Rows.Add(drProduct);

break;

case "Bikes":

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Pak Hero";

drProduct["ProductDescription"] = "125 CC";

drProduct["ProductPrice"] = "$100";

dtProducts.Rows.Add(drProduct);

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Honda";

drProduct["ProductDescription"] = "250 CC";

drProduct["ProductPrice"] = "$150";

dtProducts.Rows.Add(drProduct);

break;

case "Computers":

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Dell";

drProduct["ProductDescription"] = "P4 Centrino";

drProduct["ProductPrice"] = "$400";

dtProducts.Rows.Add(drProduct);

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "IBM";

drProduct["ProductDescription"] = "P4 Think PAD";

drProduct["ProductPrice"] = "$350";

dtProducts.Rows.Add(drProduct);

break;

case "TV":

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Sony";

drProduct["ProductDescription"] = "Plasma";

drProduct["ProductPrice"] = "$600";

dtProducts.Rows.Add(drProduct);

drProduct = dtProducts.NewRow();

drProduct["ProductName"] = "Philips";

drProduct["ProductDescription"] = "Projection";

drProduct["ProductPrice"] = "$550";

dtProducts.Rows.Add(drProduct);

break;

}

//create gridview to bind with created datable to show output

GridView grvProducts = new GridView();

grvProducts.DataSource = dtProducts;

grvProducts.DataBind();

//primarily rendered output would come in string builder (sb) object

//through stringwriter which would get data from htmltextwriter

//which would get data from RenderControl method

System.Text.StringBuilder sb = new System.Text.StringBuilder();

System.IO.StringWriter sw = new System.IO.StringWriter(sb);

HtmlTextWriter htw = new HtmlTextWriter(sw);

//render sub categories dropdownlist

grvProducts.RenderControl(htw);

//set prefix command name so at client side we could know which control to load actually and

//set rendered string

this.RenderedOutput = "LoadProducts," + sb.ToString();

}

}

/// <summary>

/// Execute/Fires when RaiseCallbackEvent code runs completely

/// </summary>

/// <returns></returns>

public string GetCallbackResult()

{

//return rendered string with command name

return RenderedOutput;

}

In Page_Load or Page_Init event

Following statements are used to register client side methods.

CallServer(arg, context) as name implies would use to call/raise server side method which was RaiseCallbackEvent string eventArgument)

ReceiveServerData(arg, context) would use to get result through arg parameter by GetCallbackResult()

//Register Client Script for Callback and populate categories

protected void Page_Load(object sender, EventArgs e)

{

ClientScriptManager scriptMgr = Page.ClientScript;

String cbReference = scriptMgr.GetCallbackEventReference(this, "arg", "ReceiveServerData", "");

String callbackScript = "function CallServer(arg, context) {" + cbReference + "; }";

cm.RegisterClientScriptBlock(this.GetType(),"CallServer", callbackScript, true);

if (!Page.IsPostBack)

{

//Load Products Data

this.ddlCategories.Items.Add("Select");

this.ddlCategories.Items.Add("Autos");

this.ddlCategories.Items.Add("Electronics");

}

}

CALLBACK CLIENT SIDE CODE

<script language="javascript" type="text/javascript">

//Runs when GetCallbackResult() executes and return result through arg param

function ReceiveServerData(arg, context)

{

//split command and contents (rendered data)

var cmd_content = arg.split(',');

//check command

if (cmd_content[0] == 'LoadSubCategory')

{

//set rendered contents to sub category div to show subcategories according to categories

document.getElementById('ddlSubcategories').innerHTML = cmd_content[1];

}

else

{

//set rendered contents to products div to show products according to categories and sub categories

document.getElementById('grvProducts').innerHTML = cmd_content[1];

}

}

//invoke by categories/subcategories dropdownlist to communicate with server for processing

function CallSrv(ddl)

{

//check command and determine either this method invoked by

//Categories Dropdownlist or by Subcategories Dropdownlist

if (ddl.id == 'ddlCategories')

{

if(ddl.value != 'Select')

{

//Set command and value to load data accordingly and call server side method RaiseCallbackEvent

CallServer('LoadSubCategory' + ',' + ddl.value, '');

}

}

else

{

//Set command and value to load data accordingly and call server side method RaiseCallbackEvent

CallServer('LoadProducts' + ',' + ddl.value, '');

}

}

</script>

Thants it. These are the steps which you need to use to call and get result from server side code using ICALLBACK.

Asynchronously output would be within a millisecond and without Postback J

Conclusion:

Callback is lightweight technique used to call server side methods asynchronously from javascript without any postback and reloading/rendering of unnecessary parts of page and unnecessary code

So we can use that when we need to perform any operation at backend means at server like update records in database or like that. You don’t need to send all your contents of page in request and make that object heavyweight which could cause slow performance.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Adnan Aman
Software Developer (Senior)
Pakistan Pakistan
computer science graduate. design and develop software using .net technologie

Comments and Discussions

 
GeneralMy vote of 1 PinmemberSeanlm767-Oct-11 10:33 
GeneralMy vote of 5 Pinmembertareq_moinul29-Sep-11 20:11 
Questionhow to rendered gridview and datalist PinmemberJatin Prajapati26-Jun-09 2:52 
Generaltroubles in RenderControl the second time PinmemberDavidRRR20-Jul-08 16:43 
GeneralRe: troubles in RenderControl the second time PinmemberAdnan Aman20-Jul-08 19:46 
can you pls post your code or exception.
 
Muhammad Adnan
Software Engineer (.NET)

GeneralRe: troubles in RenderControl the second time PinmemberDavidRRR22-Jul-08 18:58 
Generalthis.renderoutput PinmemberMember 211832417-Jun-08 1:11 
GeneralRe: this.renderoutput PinmemberAdnan Aman17-Jun-08 1:19 
GeneralSome critics... PinmemberFlowdrops18-Jan-08 22:06 
RantRe: Some critics... Pinmemberkubal500317-May-09 0:37 
GeneralRe: Some critics... PinmemberAdnan Aman17-May-09 1:59 
GeneralRe: Some critics... PinmemberAdnan Aman17-May-09 1:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.1411023.1 | Last Updated 18 Jan 2008
Article Copyright 2008 by Adnan Aman
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid