Wednesday, 26 November 2008
The difference between Web Site and Web Application Projects in VS
Comparing Web Site Projects and Web Application Projects
Another useful link to read is:
ASP.NET: Web Site versus Web Application Project
Monday, 24 November 2008
Point old dll versions to newer versions in web.config
<add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
The reason for it missing is because System.Web.Extensions.Design is now in the GAC with .NET 3.5 and it can not find version 1.0.61025.0.To fix this I placed the following config entry which routes any old dll to the new dll:
  <runtime>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
      dependentAssembly>
    assemblyBinding>
runtime>
Make sure it is below the ConfigSections.Tuesday, 18 November 2008
Using HTTPModules to globalize a website
First lets automatically detect the browser's prefered language in the web.config:
<system.web>
    <globalization uiCulture="auto" culture="auto" />
<system.web>
xml version="1.0" encoding="UTF-8"?>
<Cultures>
  <Culture Name="en-GB" NativeName="English (United Kingdom)"/>
  <Culture Name="it-IT" NativeName="Italian (Italy)"/>
Cultures>
Lets call the XML file SupportedCultures.xml.Next we will create the resx files that contain the language strings. Create the App_GlobalResources folder if it doesn't already exist within Visual Studio. Add the following resex files:

This is the contents of LocalizedText.resx:

This is the contents of LocalizedText.it-IT.resx:

Now lets move on and work on the web form:
<body>
    <form id="form1" runat="server">
    <div>
        <div>
            Browser culture: <asp:Literal ID="CurrentCulture" runat="server" Text="Current culture:{0} Current UI culture:{1}">asp:Literal>
        div>
        <div>
            Force culture: 
            <asp:DropDownList ID="CultureList" runat="server" 
                DataSourceID="SupportedCulturesDataSource" DataTextField="NativeName" 
                DataValueField="Name" AutoPostBack="True" 
                ondatabound="CultureList_DataBound" 
                onselectedindexchanged="CultureList_SelectedIndexChanged">
            asp:DropDownList>
        div>
    <h1>
        <asp:Literal ID="Header" runat="server" Text="<%$ Resources:LocalizedText, Heading %>">asp:Literal>h1>
    <asp:Literal ID="MainBody" runat="server" Text="<%$ Resources:LocalizedText, Body %>">asp:Literal>    
    <div>
        <asp:Literal ID="HomePageText" runat="server" Text="<%$ Resources:LocalizedText, HomeText %>">asp:Literal>
    div>    
    <asp:Literal ID="Footer" runat="server" Text="<%$ Resources:LocalizedText, Footer %>">asp:Literal>
    div>
    <asp:XmlDataSource ID="SupportedCulturesDataSource" runat="server" 
        DataFile="~/Resources/SupportedCultures.xml">asp:XmlDataSource>
    form>
body>
html>
On this web form we have created a literal to display the browers current culture settings (CurrentCulture). We have a drop down list (CultureList) that is databound to the XML file we created eariler which displays a list of supported cultures. You can see we using explicit localization i.e. <%$ Resources:LocalizedText, Body %>.
Now lets wire up the events:
        protected void Page_Load(object sender, EventArgs e)
        {            
            CurrentCulture.Text = string.Format(CurrentCulture.Text, Thread.CurrentThread.CurrentCulture.Name,
                Thread.CurrentThread.CurrentUICulture.Name);
        }
        protected void CultureList_SelectedIndexChanged(object sender, EventArgs e)
        {
            Response.Redirect(Request.Url.AbsolutePath + "?culture=" + CultureList.SelectedValue);
        }
        protected void CultureList_DataBound(object sender, EventArgs e)
        {
            CultureList.SelectedValue = Thread.CurrentThread.CurrentCulture.Name;
}
The HTTPModule code to handle every request is below:using System;
using System.Data;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace Sandbox.CondeNet.Platform20.HTTPModules
{
    public class GlobalizationModule : IHttpModule
    {
        #region Implement IHttpModule
        public void Init(System.Web.HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Context_BeginRequest);
        }
        public void Dispose()
        {
            
        }
        #endregion
        private void Context_BeginRequest(object sender, EventArgs e)
        {
            HttpRequest request = ((HttpApplication)sender).Request;
            HttpContext context = ((HttpApplication)sender).Context;
            string culture = request.QueryString.Get("culture");
            if (string.IsNullOrEmpty(culture) == false)
            {
                Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
                Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
            }
            context.RewritePath(request.Url.AbsolutePath);
        }
    }
}
<httpModules>
<add name="GlobalizationModule" type="Sandbox.CondeNet.Platform20.HTTPModules.GlobalizationModule, Sandbox.CondeNet.Platform20.HTTPModules" />
httpModules>
