Monday, February 8, 2010

Chaining Methods - A Simple Scenario

Assuming that you are interested in training animals, let us start with a simple ITrainable interface. :)

public interface ITrainable
{
ITrainable Train(string skill);
ITrainable Do(string skill);
}

Well, nothing fancy there. Let us go ahead and create a Dog Class, which implements this interface. The only interesting piece you may find in the Dog class is, all methods are returning a type of ITrainable. As long as our Dog class implements ITrainable, we can return 'this', i.e the current Dog Instance.

public class Dog : ITrainable
{
public string Name { get; set; }
public List Skills { get; set; }

public Dog(string name)
{
Console.WriteLine();
Console.WriteLine("Dog " + name +
" created");

Name = name;
Skills = new List();
}
public ITrainable Train(string skill)
{
Console.WriteLine("Dog " + Name +
" learned " + skill);
this.Skills.Add(skill);
return this;
}

//Let us ask the dog to perform this skill
public ITrainable Do(string skill)
{
if (Skills.Contains(skill))
Console.WriteLine("Dog " + Name +
" is doing " + skill);
else
Console.WriteLine("Dog " + Name +
": Don't know how to " + skill);

return this;

}


Now, we are ready to train our Dog fluently.

//Train one dog, Hope your name is not Bobby ;)
var dog = new Dog("Bobby");
dog.Train("Running").Train("Eating")
.Do("Running").Do("Eating");



As you can see, we are chaining the method calls, because in each call, we are returning an object of type ITrainable. You'll see what Bobby is doing in the console

Dog Bobby created
Dog Bobby learned Running
Dog Bobby learned Eating
Dog Bobby is doing Running
Dog Bobby is doing Eating

Friday, February 5, 2010

Exporing IIS

Hi All

Please go through the below URL

http://www.codeproject.com/KB/aspnet/ExploringIIS.aspx

Concepts of ViewState

Introduction

The aim of this article is to clarify the question that many new Web developers might have about ViewState.

Why do some Web controls like Textbox retain values even after disabling the ViewState while others do not?

Background

Let’s build a simple Web application to examine how ViewState works.

Create a blank Web project and paste the code given below in the page:



script runat="server">

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles btnSubmit.Click
lblMessage.Text = "Goodbye everyone"
lblMessage1.Text = "Goodbye everyone"
txtMessage.Text = "Goodbye everyone"
txtMessage1.Text = "Goodbye everyone"
End Sub
script>
<form id="form1" runat="server">

<asp:Label runat="server" ID="lblMessage" EnableViewState =true
Text="Hello World"></asp:Label>
<asp:Label runat="server" ID="lblMessage1" EnableViewState =false
Text="Hello World"></asp:Label>
<asp:Textbox runat="server" ID="txtMessage" EnableViewState =true
Text="Hello World"></asp:Textbox>
<asp:Textbox runat="server" ID="txtMessage1" EnableViewState =false
Text="Hello World"></asp:Textbox>
<br />
<asp:Button runat="server"
Text="Change Message" ID="btnSubmit"></asp:Button>
<br />
<asp:Button ID="btnEmptyPostBack" runat="server" Text="Empty Postback"></asp:Button>
</form>


The page rendered will have four controls (two text boxes and two labels) initialized with Hello World and two buttons.

Click on the Change Message button, the value in controls will be changed to Goodbye Everyone.

Now click on the Empty Postback button.

The expected result is, after postback the Textbox (txtMessage) and label (lblMessage) with EnableViewState = false should not retain the value and hence the value should be Hello world, while the controls with ViewState enabled (txtMessage1 and lblMessage1) should retain the value and hence value should be Goodbye world.

But this does not happen. Both the Textbox will maintain the value irrespective of whether ViewState is enabled or disabled, but in the case of label control if ViewState is disabled, the value we changed programmatically is not retained.



Let's examine why this happens?

Page LifeCycle and ViewState

In page life cycle, two events are associated with ViewState:

  • Load View State: This stage follows the initialization stage of page lifecycle. During this stage, ViewState information saved in the previous postback is loaded into controls. As there is no need to check and load previous data, when the page is loaded for the first time this stage will not happen. On subsequent postback of the page as there may be previous data for the controls, the page will go through this stage.
  • Save View State: This stage precedes the render stage of the page. During this stage, current state (value) of controls is serialized into 64 bit encoded string and persisted in the hidden control (__ViewState) in the page.
  • Load Postback Data stage: Though this stage has nothing to do with ViewState, it causes most of the misconception among developers. This stage only happens when the page has been posted back. ASP.NET controls which implement IPostBackEventHandler will update its value (state) from the appropriate postback data. The important things to note about this stage are as follows:
  1. State (value) of controls are NOT retrieved from ViewState but from posted back form.
  2. Page class will hand over the posted back data to only those controls which implement IPostBackEventHandler.
  3. This stage follows the Load View State stage, in other words state of controls set during the Load View State stage will be overwritten in this stage.

Answers

Now with the above information, let us try to answer the question:

Why some controls retain values even after disabling the ViewState while others do not?

The answer is Controls which implements IPostBackEventHandler like Textbox, Checkbox, etc. will retain the state even after disabling the viewstate. The reason is during the Load Postback Data stage, these controls will get state information from Posted back form.

But controls like label which do not implement IPostBackEventHandler will not get any state information from posted back data and hence depend entirely on viewstate to maintain the state.

Conclusion

In this article, we examined how the ViewState of control is persisted during the life cycle of page and why some controls maintain the state even if the ViewState is disabled. Hope the information provided here is useful.