Exporting XML in a C# ASP .NET Web Application

August 16, 2011 2 comments

XML (extensible markup language) is a popular format of data for importing and exporting between different applications designed using different programming languages. Since XML uses a standardized format of data, applications can easily parse the XML data to pull out specific fields, blocks, and even write their own XML files. XML is especially useful as a protocol for communicating over the Internet with applications

using (System.IO.MemoryStream stream = new System.IO.MemoryStream())

{

// Create an XML document. Write our specific values into the document.

System.Xml.XmlTextWriter xmlWriter = new System.Xml.XmlTextWriter(stream, System.Text.Encoding.ASCII);

// Write the XML document header.

xmlWriter.WriteStartDocument();

// Write our first XML header.

xmlWriter.WriteStartElement(“WebApplications”);

// Write an element representing a single web application object.

xmlWriter.WriteStartElement(“WebApplication”);

// Write child element data for our web application object.

xmlWriter.WriteElementString(“Date”, DateTime.Now.ToString());

xmlWriter.WriteElementString(“Programmer”, “Primary Objects”);

xmlWriter.WriteElementString(“Name”, “Hello World”);

xmlWriter.WriteElementString(“Language”, “C# ASP .NET”);

xmlWriter.WriteElementString(“Status”, “Complete”);

// End the element WebApplication

xmlWriter.WriteEndElement();

// End the document WebApplications

xmlWriter.WriteEndElement();

// Finalize the XML document by writing any required closing tag.

xmlWriter.WriteEndDocument();

// To be safe, flush the document to the memory stream.

xmlWriter.Flush();

// Convert the memory stream to an array of bytes.

byte[] byteArray = stream.ToArray();

// Send the XML file to the web browser for download.

Response.Clear();

Response.AppendHeader(“Content-Disposition”, “filename=MyExportedFile.xml”);

Response.AppendHeader(“Content-Length”, byteArray.Length.ToString());

Response.ContentType = “application/octet-stream”;

Response.BinaryWrite(byteArray);

xmlWriter.Close();

}

Categories: ASP.Net, C#

Creating Crystal reports in ASP.NET

August 12, 2011 3 comments

Create a new website and right click on

solution explorer >

add new Item

Select Crystal Report

In the dialog box choose blank report

 

 

Now click on Crystal Report Menu in Visual Studio 2010 and select Database Expert

 

 

Select OLE DB under “Create New Connection” and select Data Provider.

 

 

Click on Next, In Next Screen provide Server name and credential. And select Database.

 

 

Now from Database field, drag and drop fields as required in the report.

 

Add New ASPX Page and drag Crystal Report viewer  on the form.

Click on smart tag of Report Viewer and choose report source and click on finish.

Here is the HTML markup.

<CR:CrystalReportViewer ID=”CrystalReportViewer1″ runat=”server”

AutoDataBind=”True” GroupTreeImagesFolderUrl=”” Height=”1202px”

ReportSourceID=”CrystalReportSource1″ ToolbarImagesFolderUrl=””

ToolPanelWidth=”200px” Width=”1104px” />

<CR:CrystalReportSource ID=”CrystalReportSource1″ runat=”server”>

<Report FileName=”CrystalReport.rpt”>

</Report>

</CR:CrystalReportSource>

 

Add following code in Page_load,

 

protected void Page_Load(object sender, EventArgs e)

{

ReportDocument crystalReport = new ReportDocument();

crystalReport.Load(Server.MapPath(“CrystalReport.rpt”));

CrystalReportViewer1.ReportSource = crystalReport;

}

 

 

Cloud Storage global war

It’s been a “Cloud” a buzzing word nowadays, since Apple introduce its icloud in iOS 5 before few days…

It’s been a busy time for cloud storage and music services and Apple’s launch onto the scene with Apple iCloud has officially declared it global war.

http://www.pocket-lint.com/news/40364/icloud-google-music-dropbox-skydrive-amazon-cloud-player

But did you know that iCloud is using Micrososft azure and amazons cloud service????

http://www.infiniteapple.net/is-icloud-utilizing-microsoft-azure-and-amazons-cloud-services

I have tried to find something about Microsoft Live Skydrive

Windows Live SkyDrive (initially Windows Live Folders) is part of Microsoft’s Windows Live range of online services. SkyDrive is a File hosting service that allows users to upload files to a cloud storage and then access them from a Web browser. It uses Windows Live ID to control access to the user’s files, allowing them to keep the files private, share with contacts, or make the files public. Publicly-shared files do not require a Windows Live ID to access.

 

The service offers 25 GB of free personal storage, with individual files limited to 50 MB. A Silverlight-based tool can be installed to allow drag-and-drop uploading from any Silverlight enabled browser such as Windows Explorer on a Windows machine or Safari on a Apple Macintosh computer. Up to five files can be uploaded each time if the tool has not been installed.

You can access skydrive from here…

http://explore.live.com/windows-live-skydrive

 

icloud information can be accessed from here,

http://www.apple.com/icloud/what-is.html

Its been my little attempt to dig on cloud storage.

It’s good that every giant is coming with their own cloud storage product with their own fancy names…. But the big question would be how secure is cloud storage??

Categories: cloud

How To See Last Modified Date of Objects in SQL Server 2008

declare @day as int
set @day = 12
select * from
(SELECT [name],create_date,modify_date,’table’ type1,1 order1 FROM sys.tables
union
SELECT [name],create_date,modify_date,’view’ type1,2 order1 FROM sys.views
union
SELECT [name],create_date,modify_date,’trigger’ type1,5 order1 FROM sys.triggers
union
SELECT [name],create_date,modify_date,’sp’ type1,3 order1 FROM sys.procedures
WHERE [type] = ‘P’ AND is_ms_shipped = 0 AND [name] NOT LIKE ‘sp[_]%diagram%’
union
select [name],create_date,modify_date,’fn’ type1,4 order1 from sys.objects where type_desc like ‘%function%’)
as modify_table
where datediff(dd,modify_date,getdate())<@day
ORDER BY order1,modify_date DESC

Categories: SQL Server

Move ViewState to the bottom of the page

If you move your viewstate from the top of the page to the bottom, you will get better search engine spidering.

 

Step 1 :

Create a class file in App_code folder of your application and name it as “PageBase.cs“. Copy following code to the class file.

 

using System.IO;

using System.Web.UI;

 

namespace WebPageBase

{

public class PageBase : System.Web.UI.Page

{

/// This method overrides the Render() method for the page and moves the ViewState

/// from its default location at the top of the page to the bottom of the page. This

/// results in better search engine spidering.

 

protected override void Render(System.Web.UI.HtmlTextWriter writer)

{

// Obtain the HTML rendered by the instance.

StringWriter sw = new StringWriter();

HtmlTextWriter hw = new HtmlTextWriter(sw);

base.Render(hw);

string html = sw.ToString();

 

// Hose the writers we don’t need anymore.

hw.Close();

sw.Close();

 

// Find the viewstate.

int start = html.IndexOf(@”<input type=””hidden”” name=””__VIEWSTATE””” );

// If we find it, then move it.

if (start > -1)

{

int end = html.IndexOf(“/>”, start) + 2;

 

string strviewstate = html.Substring(start, end – start);

html = html.Remove(start, end – start);

 

// Find the end of the form and insert it there.

int formend = html.IndexOf(@”</form>”) – 1;

html = html.Insert(formend, strviewstate);

}

 

// Send the results back into the writer provided.

writer.Write(html);

}

}

}

 

 

Step 2 :

Inherit your aspx pages from the base class.

 

public partial class Page : WebPageBase.PageBase

{

// Your code here

}

ASP.Net 4.0 Enahanced Feature

  • Web.config changes

    In .Net Framework 4.0, the major configuration elements have been moved to the machine.config file, and applications now inherit these settings. This allows web.config file to be empty or contains 2 or 3 customized entry.

    • Permanently Redirecting a Page

      . In ASP.NET, developers have traditionally handled requests to old URLs by using by using the Response.Redirect method to forward a request to the new URL. However, the Redirect method issues an HTTP 302 Found (temporary redirect) response, which results in an extra HTTP round trip when users attempt to access the old URLs.

      ASP.NET 4 adds a new RedirectPermanent helper method that makes it easy to issue HTTP 301 Moved Permanently responses, as in the following example:

      • RedirectPermanent(“Newpage.aspx”);

      • Compression of Session

      ASP.NET provides two default options for storing session state across a Web farm: a session-state provider that invokes an out-of-process session-state server, and a session-state provider that stores data in a Microsoft SQL Server database. Because both options involve storing state information outside a Web application’s worker process, session state has to be serialized before it is sent to remote storage. Depending on how much information a developer saves in session state, the size of the serialized data can grow quite large.

      ASP.NET 4 introduces a new compression option for both kinds of out-of-process session-state providers. When the compressionEnabled configuration option shown in the following example is set to true, ASP.NET will compress (and decompress) serialized session state by using the .NET Framework System.IO.Compression.GZipStream class

      <sessionState mode=”SqlServer”

      sqlConnectionString=”data source=servername;Initial Catalog=aspnetstate”

      allowCustomSqlDatabase=”true” compressionEnabled=”true” />

      • Expanding the Range of Allowable URLs

        ASP.NET 4 introduces new options for expanding the size of application URLs. Previous versions of ASP.NET constrained URL path lengths to 260 characters, based on the NTFS file-path limit. In ASP.NET 4, you have the option to increase (or decrease) this limit as appropriate for your applications, using two new httpRuntime configuration attributes. The following example shows these new attributes.

        ASP.NET 4 also enables you to configure the characters that are used by the URL character check.

        When ASP.NET finds an invalid character in the path portion of a URL, it rejects the request and issues an HTTP 400 error.

        <httpRuntime maxRequestPathLength=”260″ maxQueryStringLength=”2048″

        requestPathInvalidChars=”&lt;,&gt;,*,%,&amp;,:,\,?” />

        • CSS Friendly Menu control

          Menu control will Render in <ul> and <li> instead of table. You can specify its property Renderingmode=”list”

          1. Performance Monitoring for Individual Applications in a Single Worker Process

          In order to increase the number of Web sites that can be hosted on a single server, many hosters run multiple ASP.NET applications in a single worker process. However, if multiple applications use a single shared worker process, it is difficult for server administrators to identify an individual application that is experiencing problems.

          ASP.NET 4 leverages new resource-monitoring functionality introduced by the CLR. To enable this functionality, you can add the following XML configuration snippet to the aspnet.config configuration file.

          <?xml version=”1.0″ encoding=”UTF-8″ ?>

          <configuration>

          <runtime>

          <appDomainResourceMonitoring enabled=”true”/>

          </runtime>

          </configuration>

          When the appDomainResourceMonitoring feature has been enabled, two new performance counters are available in the “ASP.NET Applications” performance category: % Managed Processor Time and Managed Memory Used. Both of these performance counters use the new CLR application-domain resource management feature to track estimated CPU time and managed memory utilization of individual ASP.NET applications. As a result, with ASP.NET 4, administrators now have a more granular view into the resource consumption of individual applications running in a single worker process.

          • Multi-Targeting

            You can create an application that targets a specific version of the .NET Framework. In ASP.NET 4, a new attribute in the compilation element of the Web.config file lets you target the .NET Framework 4 and later. If you explicitly target the .NET Framework 4, and if you include optional elements in the Web.config file such as the entries for system.codedom, these elements must be correct for the .NET Framework 4. (If you do not explicitly target the .NET Framework 4, the target framework is inferred from the lack of an entry in the Web.config file.)

            The following example shows the use of the targetFramework attribute in the compilation element of the Web.config file.

            <compilation targetFramework=”4.0″/>

            • jQuery Included

              When you create a new website or project, a Scripts folder containing the following 3 files is created:

              • jQuery-1.4.1.js – The human-readable, unminified version of the jQuery library.
              • jQuery-14.1.min.js – The minified version of the jQuery library.
              • jQuery-1.4.1-vsdoc.js – The Intellisense documentation file for the jQuery library.

              Include the unminified version of jQuery while developing an application. Include the minified version of jQuery for production applications.

              In the past, if you used the ASP.NET ScriptManger then you were required to load the entire monolithic ASP.NET Ajax Library. By taking advantage of the new ScriptManager.AjaxFrameworkMode property, you can control exactly which components of the ASP.NET Ajax Library are loaded and load only the components of the ASP.NET Ajax Library that you need.

              • ScriptManager Explicit Scripts

              The ScriptManager.AjaxFrameworkMode property can be set to the following values:

              • Enabled — Specifies that the ScriptManager control automatically includes the MicrosoftAjax.js script file, which is a combined script file of every core framework script (legacy behavior).
              • Disabled — Specifies that all Microsoft Ajax script features are disabled and that the ScriptManager control does not reference any scripts automatically.
              • Explicit — Specifies that you will explicitly include script references to individual framework core script file that your page requires, and that you will include references to the dependencies that each script file requires.

              For example, if you set the AjaxFrameworkMode property to the value Explicit then you can specify the particular ASP.NET Ajax component scripts that you need:

              <asp:ScriptManager ID=”sm1″ AjaxFrameworkMode=”Explicit” runat=”server”>

              <Scripts>

              <asp:ScriptReference Name=”MicrosoftAjaxCore.js” />

              <asp:ScriptReference Name=”MicrosoftAjaxComponentModel.js” />

              <asp:ScriptReference Name=”MicrosoftAjaxSerialization.js” />

              <asp:ScriptReference Name=”MicrosoftAjaxNetwork.js” />

              </Scripts>

              </asp:ScriptManager>

              • Setting Meta Tags with the Page.MetaKeywords and Page.MetaDescription Properties

              ASP.NET 4 adds two properties to the Page class, MetaKeywords and MetaDescription. These two properties represent corresponding meta tags in your page, as shown in the following example:

              <head id=”Head1″ runat=”server”>

              <title>Untitled Page</title>

              <meta name=”keywords” content=”These, are, my, keywords” />

              <meta name=”description” content=”This is the description of my page” />

              </head>

              These two properties work the same way that the page’s Title property does.

              1. Enabling View State for Individual Controls

              The ViewStateMode property takes an enumeration that has three values: Enabled, Disabled, and Inherit. Enabled enables view state for that control and for any child controls that are set to Inherit or that have nothing set. Disabled disables view state, and Inherit specifies that the control uses the ViewStateMode setting from the parent control.

              1. Changes to Browser Capabilities

              ASP.NET determines the capabilities of the browser that a user is using to browse your site by using a feature called browser capabilities. Browser capabilities are represented by the HttpBrowserCapabilities object

              For example, you can use the HttpBrowserCapabilities object to determine whether the type and version of the current browser supports a particular version of JavaScript. Or, you can use the HttpBrowserCapabilities object to determine whether the request originated from a mobile device.

              • Setting Client IDs

                The id attribute in HTML that is rendered for Web server controls is generated based on the ClientID property of the control. Until ASP.NET 4, the algorithm for generating the id attribute from the ClientID property has been to concatenate the naming container (if any) with the ID, and in the case of repeated controls (as in data controls), to add a prefix and a sequential number. While this has always guaranteed that the IDs of controls in the page are unique, the algorithm has resulted in control IDs that were not predictable, and were therefore difficult to reference in client script.

                The new ClientIDMode property lets you specify more precisely how the client ID is generated for controls. You can set the ClientIDMode property for any control, including for the page. Possible settings are the following:

                • AutoID – This is equivalent to the algorithm for generating ClientID property values that was used in earlier versions of ASP.NET.
                • Static – This specifies that the ClientID value will be the same as the ID without concatenating the IDs of parent naming containers. This can be useful in Web user controls. Because a Web user control can be located on different pages and in different container controls, it can be difficult to write client script for controls that use the AutoID algorithm because you cannot predict what the ID values will be.
                • Predictable – This option is primarily for use in data controls that use repeating templates. It concatenates the ID properties of the control’s naming containers, but generated ClientID values do not contain strings like “ctlxxx”. This setting works in conjunction with the ClientIDRowSuffix property of the control. You set the ClientIDRowSuffix property to the name of a data field, and the value of that field is used as the suffix for the generated ClientID value. Typically you would use the primary key of a data record as the ClientIDRowSuffix value.
                • Inherit – This setting is the default behavior for controls; it specifies that a control’s ID generation is the same as its parent.

                In some scenarios, such as when you are using master pages, controls can end up with IDs like those in the following rendered HTML:

                ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1

                This ID is guaranteed to be unique in the page, but is unnecessarily long for most purposes.The easiest way to reduce the length of the rendered ID is by setting the ClientIDMode property as shown in the following example:

                <tc:NamingPanel runat=”server” ID=”NamingPanel1″ ClientIDMode=”Predictable”>

                <asp:TextBox ID=”TextBox1″ runat=”server” Text=”Hello!”></asp:TextBox>

                </tc:NamingPanel>

                • ASP.NET Chart Control

                .NET Framework 4 release includes following feature of chart.

                • 35 distinct chart types.
                • An unlimited number of chart areas, titles, legends, and annotations.
                • A wide variety of appearance settings for all chart elements.
                • 3-D support for most chart types.
                • Smart data labels that can automatically fit around data points.
                • Strip lines, scale breaks, and logarithmic scaling.
                • More than 50 financial and statistical formulas for data analysis and transformation.
                • Simple binding and manipulation of chart data.
                • Support for common data formats such as dates, times, and currency.
                • Support for interactivity and event-driven customization, including client click events using Ajax.
                • State management.
                • Binary streaming.
                • ListView Control Enhancements

                The ListView control has been made easier to use in ASP.NET 4. The earlier version of the control required that you specify a layout template that contained a server control with a known ID. The following markup shows a typical example of how to use the ListView control in ASP.NET 3.5.

                <asp:ListView ID=”ListView1″ runat=”server”>

                <LayoutTemplate>

                <asp:PlaceHolder ID=”ItemPlaceHolder” runat=”server”></asp:PlaceHolder>

                </LayoutTemplate>

                <ItemTemplate>

                <% Eval(“LastName”)%>

                </ItemTemplate>

                </asp:ListView>

                In ASP.NET 4, the ListView control does not require a layout template. The markup shown in the previous example can be replaced with the following markup:

                <asp:ListView ID=”ListView1″ runat=”server”>

                <ItemTemplate>

                <% Eval(“LastName”)%>

                </ItemTemplate>

                </asp:ListView>

                • CheckBoxList and RadioButtonList Control Enhancements

                  In ASP.NET 3.5, you can specify layout for the CheckBoxList and RadioButtonList using the following two settings:

                  • Flow. The control renders span elements to contain its content.
                  • Table. The control renders a table element to contain its content.

                  In ASP.NET 4, the CheckBoxList and RadioButtonList controls support the following new values for the RepeatLayout property:

                  • OrderedList – The content is rendered as li elements within an ol element.
                  • UnorderedList – The content is rendered as li elements within a ul element.
                  • Default Hashing Algorithm is changed to HMACSHA256

                  ASP.NET uses both encryption and hashing algorithms to help secure data such as forms authentication cookies and view state. By default, ASP.NET 4 now uses the HMACSHA256 algorithm for hash operations on cookies and view state. Earlier versions of ASP.NET used the older HMACSHA1 algorithm.

                  Categories: ASP.Net 4.0

                  10 Principal for keeping Your Programming code clean

                  February 2, 2011 Leave a comment

                  A common issue in almost every profession that can drive people completely insane is having to continue from what somebody else started. The main reason for this being the fact that everyone has different ways of working, and sometimes these self-induced habits can be just downright messy.

                  In order to make code look cleaner, and thus, support team work (meaning that somebody else might need to work with what was coded before), there are certain considerations that should be taken into account.

                  1. Revise Your Logic Before Coding

                  Before blindly typing into the debugger of choice, some flow diagrams or written pseudo-code might come in handy to previously verify the logic behind those lines of code. Writing it down first can clarify many doubts or insecurities about complex functionality, and therefore save a lot of time. But most importantly, helping you get it right faster will also help you avoid all the messy code replacements and additions that tamper with the following principles.

                  2. Clearly Expose the Structure of the Page

                  Working with main containers is useful, but working with main containers with a representative ID is even more useful. Consider the following starting scenario:

                  1

                  2

                  3

                  4

                  5

                  6

                  7

                  8

                  9

                  10

                  11

                  12

                  13

                  14

                  15

                  16

                  <div id=”main-container”>

                  <div id=”header”>

                  <div id=”logo”>…</div>

                  <div id=”main-menu”>…</div>

                  </div>

                  <div id=”content”>

                  <div id=”left-column”>…</div>
                  <div id=”center-column”>…</div>

                  <div id=”right-column”>…</div>

                  </div>

                  <div id=”footer”>

                  <div id=”footer-menu”>…</div>

                  <div id=”disclaimer”>…</div>

                  </div>

                  </div>

                  The structure appears evident, thanks to the DIV containers that are concretely named after their destined content. Not only will it be simpler to start adding code, but it’ll also be perfectly transparent for someone who tries to add or remove something afterward. This structuring method, however, should be aided by the next statement.

                   3. Use the Correct Indentation

                  Supporting the previous pronouncement on structure, indentation distinctly displays the opening and closing points of each element used. If every line of code is glued to the left side of the screen, it’ll be very hard to distinguish the exact place where an element is closed. Therefore, it’ll mess up the effort made at designing a complete structure, since it won’t be noticeable afterward.

                   4. Write Explanatory Comments

                  Underestimating the value of good comments is disregarding a very effective way of code documentation. It’s easy, fast, and very straight-to-the-point, since it’s done right then and there when it’s needed.

                  Comments are also efficient considering the fact that they can be read at the exact moment of doubt. They can, however, be overused. And that brings us to the next recommendation.

                   5. Avoid Abusing Comments

                  Comments aren’t to be treated lightly. When commenting on code, the current functionality is explained in terms of variables and results. What comments are NOT made for is:

                  • Writing explanatory notes to self (e.g. /* Will finish this later… */).
                  • Blaming stuff on other people (e.g. /* John coded this. Ask him. */).
                  • Writing vague statements (e.g. /* This is another math function. */).
                  • Erasing chunks of code. Sometimes people are not sure of erasing things and it’s not absolutely evil to comment that code instead.

                  What’s not right is to just leave it afterwards. It’ll be terribly confusing. If the code will be documented via embedded comments, the team members need to make sure those comments are there for a reason.

                  Examples of good comment use are:

                  • Authoring specifications (e.g. /* Coded by John, November 13th 2010 */).
                  • Detailed statements on the functionality of a method or procedure (e.g. /* This function validates the login form with the aid of the e-mail check function */).
                  • Quick notifications or labels that state where a recent change was made (e.g. /* Added e-mail validation procedure */).

                  6. Avoid Extremely Large Functions

                  In the process of adding functionality to an application, its coded methods tend to grow accordingly. One can come across functions that consist of up to a hundred lines of code, and this tends to become confusing.

                  A better practice would be to break up large functions into smaller ones. Some procedures may even be repeating themselves amongst the rest of the functions conforming the whole application process. The team could make better use of those repeated procedures through separate functions. This, however, should have been avoided from the beginning if the first recommendation was carried out correctly.

                   7. Use Naming Standards for Functions and Variables

                  Whenever a variable or a function is created, its name should be descriptive enough as to give a general idea of what it does or what it’s for.

                  There are companies that have their own pre-established naming standards

                  (e.g. The prefix ‘int_’ for any numeric variables), but there are also many companies in which the employees do not keep these standards. Laziness makes people work double the time during future redesigns, so everyone needs to start learning how to get rid of it.

                   8. Treat Changes with Caution

                  The correct appliance of changes summarizes a lot of what has been previously said, like commenting meaningfully and not disrupting indentations. Nevertheless, it needs to be emphasized. Whenever there’s a need for adding, removing, or changing something, there should also be an awareness of not meddling with previous efforts for maintaining the code clean and ordered.

                  This mainly involves:

                  • Keeping the correct indentations (e.g. when inserting an IF clause, its contents’ indentations will be augmented).
                  • Commenting on the modification made or broadening the existing comments.
                  • Respecting standards in use.

                   

                  9. Avoid Indiscriminate Mixing of Coding Languages

                  In-line CSS styling and scattered JavaScript tags with short procedures within them are very good examples of incorrect mixing of coding languages throughout your development process. Ignoring this principle will result in huge element tags with an embedded STYLE property, lots of interruptions in the flow of the structure because of embedded functions, and of course lots and lots of confusion.

                  Even with the addition of comments, it’ll still look like everything and nothing at the same time. Having the appropriate divisions between different coding languages will give order to the logic applied. This brings us, though, to the next consideration.

                   10. Summarize Your Imports

                  Even though it is much better to have additional coding languages imported from different files, this shouldn’t be abused. If there are too many style sheets, they can probably be summarized into one or two.

                  This won’t only save space and make things look cleaner, but it will also save loading time. Each imported file is an HTTP request that tampers with the performance of your application. So apart from being a consideration for tidiness, it is also a consideration for efficiency.

                  Categories: ASP.Net, ASP.Net 3.5