eWorld.UI - Matt Hawley

Ramblings of Matt

ASP.NET MVC - Localization Helpers

May 16, 2008 15:58 by matthaw

You're localizing your application right? Sure, I bet we ALL are - or at least, we're all storing our strings in resource files so that later we can localize. I know, I don't either :) but that doesn't mean if you're working on a large application that needs to be localized in many different languages, you shouldn't be thinking about it. While localization was possible in 1.0/1.1, ASP.NET 2.0 introduced us to a new expression syntax that made localization much easier, simply writing the following code

   1:  <asp:Label Text="<%$ Resources:Strings, MyGlobalResource %>" runat="server" />
   2:  <asp:Label Text="<%$ Resources:MyLocalResource %>" runat="server" />

Of course, you could always use the verbose way and call out to the HttpContext to get local and global resources, but I really enjoy writing the expression syntax much better as it truly implies that the code knows the context of your view / page. So, you could write both of the above examples like

   1:  <%= HttpContext.Current.GetGlobalResourceString("Strings", "MyGlobalResources",
   2:            CultureInfo.CurrentUICulture) %>
   3:  <%= HttpContext.Current.GetLocalResourceString("~/views/products/create.aspx", 
   4:            "MyLocalResource", CultureInfo.CurrentUICulture) %>

So now, you've started on that next big project and have been given the green light to use ASP.NET MVC, but ... your application needs to be localized in Spanish as well. In the current bits, there's really no way of using localized resources aside from (gasp!) using the Literal server control or the verbose method. But, you're moving to MVC to get away from the web forms model & nomenclature, so those are not an option any longer. Well, taking my earlier example of PRG pattern, I decided to "localize" it in an example of your project. First off, you'll need to create your global and local resources. Add a "App_GlobalResources" folder to the root. Add a Strings.resx file, and start to enter your text. Next, we'll add 2 local resources for our views. Under /Views/Products, create a "App_LocalResources", and 2 .resx files named "Create.aspx.resx" and "Confirm.aspx.resx".

 

Okay, now you're all set. Let's start converting our code to use the resources. You'll see that I'm using a new extension method (code will come later) in both the controller actions and in the view itself.

 

   1:  public class ProductsController : Controller
   2:  {
   3:      public ActionResult Create()
   4:      {
   5:          if (TempData["ErrorMessage"] != null)
   6:          {
   7:              ViewData["ErrorMessage"] = TempData["ErrorMessage"];
   8:              ViewData["Name"] = TempData["Name"];
   9:              ViewData["Price"] = TempData["Price"];
  10:              ViewData["Quantity"] = TempData["Quantity"];
  11:          }
  12:          return RenderView();
  13:      }
  14:   
  15:      public ActionResult Submit()
  16:      {
  17:          string error = null;
  18:          string name = Request.Form["Name"];
  19:          if (string.IsNullOrEmpty(name))
  20:              error = this.Resource("Strings, NameIsEmpty");
  21:   
  22:          decimal price;
  23:          if (!decimal.TryParse(Request.Form["Price"], out price))
  24:              error += this.Resource("Strings, PriceIsEmpty");
  25:   
  26:          int quantity;
  27:          if (!int.TryParse(Request.Form["Quantity"], out quantity))
  28:              error += this.Resource("Strings, QuantityIsEmpty");
  29:   
  30:          if (!string.IsNullOrEmpty(error))
  31:          {
  32:              TempData["ErrorMessage"] = error;
  33:              TempData["Name"] = Request.Form["Name"];
  34:              TempData["Price"] = Request.Form["Price"];
  35:              TempData["Quantity"] = Request.Form["Quantity"];
  36:              return RedirectToAction("Create");
  37:          }
  38:   
  39:          return RedirectToAction("Confirm");
  40:      }
  41:   
  42:      public ActionResult Confirm()
  43:      {
  44:          return RenderView();
  45:      }
  46:  }

Next, convert views over to use the new Resource extension method, below is the Create view:

   1:  <% using (Html.Form<ProductsController>(c => c.Submit())) { %>
   2:      <% if (!string.IsNullOrEmpty((string)ViewData["ErrorMessage"])) { %>
   3:          <div style="color:Red;">
   4:              <%= ViewData["ErrorMessage"] %>
   5:          </div>
   6:      <% } %>
   7:      <%= Html.Resource("Name") %> <%= Html.TextBox("Name", ViewData["Name"]) %><br />
   8:      <%= Html.Resource("Price") %> <%= Html.TextBox("Price", ViewData["Price"]) %><br />
   9:      <%= Html.Resource("Quantity") %> <%= Html.TextBox("Quantity", ViewData["Quantity"]) %><br />
  10:      <%= Html.SubmitButton("submitButton", Html.Resource("Save")) %>
  11:  <% } %>

Here's the Confirm view:

   1:  <%= Html.Resource("Thanks") %><br /><br />
   2:  <%= Html.Resource("CreateNew", Html.ActionLink<ProductsController>(c => c.Create(), 
   3:                             Html.Resource("ClickHere"))) %>

As you can see, I'm using a mixture of resource expressions both within the controller and view implementation. Here are the main implementations:

   1:  // default global resource
   2:  Html.Resource("GlobalResource, ResourceName")
   3:   
   4:  // global resource with optional arguments for formatting
   5:  Html.Resource("GlobalResource, ResourceName", "foo", "bar")
   6:   
   7:  // default local resource
   8:  Html.Resource("ResourceName")
   9:   
  10:  // local resource with optional arguments for formatting
  11:  Html.Resource("ResourceName", "foo", "bar")

As you can see, it supports both Global Resources and Local Resources. When working within your controller actions, only Global Resources work as we don't have a concept of a "local resource." The implementation for Html.Resource is actually a wrapper around the verbose method I previously mentioned. It does, however, take into consideration the expression syntax and the context of where the code is calling from to smartly determine the correct resource call to make. A gotcha in the codebase is that this code will only work with the WebFormViewEngine out of the box for local resources. The reason for this is that the code needs a way to find the associated virtual path for the view it's currently rendering using the view engine's own ViewLocator. Should you be using another View Engine, you'll have to modify the codebase to use it's ViewLocator. So, here's the code:

   1:  public static string Resource(this HtmlHelper htmlhelper, 
   2:                                string expression, 
   3:                                params object[] args)
   4:  {
   5:      string virtualPath = GetVirtualPath(htmlhelper);
   6:   
   7:      return GetResourceString(htmlhelper.ViewContext.HttpContext, expression, virtualPath, args);
   8:  }
   9:   
  10:  public static string Resource(this Controller controller, 
  11:                                string expression, 
  12:                                params object[] args)
  13:  {
  14:      return GetResourceString(controller.HttpContext, expression, "~/", args);
  15:  }
  16:   
  17:  private static string GetResourceString(HttpContextBase httpContext, 
  18:                                          string expression, 
  19:                                          string virtualPath, 
  20:                                          object[] args)
  21:  {
  22:      ExpressionBuilderContext context = new ExpressionBuilderContext(virtualPath);
  23:      ResourceExpressionBuilder builder = new ResourceExpressionBuilder();
  24:      ResourceExpressionFields fields = (ResourceExpressionFields)builder
  25:                                              .ParseExpression(expression, typeof(string), context);
  26:   
  27:      if (!string.IsNullOrEmpty(fields.ClassKey))
  28:          return string.Format((string)httpContext.GetGlobalResourceObject(
  29:                                                      fields.ClassKey, 
  30:                                                      fields.ResourceKey, 
  31:                                                      CultureInfo.CurrentUICulture),
  32:                              args);
  33:   
  34:      return string.Format((string)httpContext.GetLocalResourceObject(
  35:                                                      virtualPath, 
  36:                                                      fields.ResourceKey, 
  37:                                                      CultureInfo.CurrentUICulture), 
  38:                              args);
  39:  }
  40:   
  41:  private static string GetVirtualPath(HtmlHelper htmlhelper)
  42:  {
  43:      string virtualPath = null;
  44:      Controller controller = htmlhelper.ViewContext.Controller as Controller;
  45:   
  46:      if (controller != null)
  47:      {
  48:          WebFormViewEngine viewEngine = controller.ViewEngine as WebFormViewEngine;
  49:          if (viewEngine != null)
  50:          {
  51:              virtualPath = viewEngine.ViewLocator.GetViewLocation(
  52:                                                      new RequestContext(controller.HttpContext, 
  53:                                                               controller.RouteData), 
  54:                                                               htmlhelper.ViewContext.ViewName);
  55:          }
  56:      }
  57:   
  58:      return virtualPath;
  59:  }

And just so you know I'm not lying - here's the output in English and Spanish!

English Spanish

Since this example code is so lengthy, I've zipped up the main code to make things much easier for you to bring into your solution.

kick it on DotNetKicks.com


Currently rated 4.8 by 11 people

  • Currently 4.818182/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Comments

May 27. 2008 01:39

For the actual translation, maybe I am allowed to do some self-advertising of my (free) translation tool: www.codeproject.com/.../ZetaResourceEditor.aspx

Uwe

May 29. 2008 09:20

Is there any reason you can't use

<%= GetLocalResourceObject("foo").ToString() %>

to obtain local resources? I tested it while looking for a way to get strongly typed access to the resources and it seems to work in an MVC app.

Harry

May 30. 2008 00:58

@Harry - that works too, but the reason I extended it is for the following

1. Verbocity of the method call (I want short calls)
2. The use with other view engines (your example depends upon a view from Page/UserControl)
3. I really like the way you define the expression like <%$ Resource: Foo, Bar %>, my method is agnostic of Global/Local resources because it encapsulates both.

matthaw

May 31. 2008 01:59

what's the best way get/set localization language (culture) as part of URL, not query string parameter?

thanks,
Al

Al

May 31. 2008 03:26

I would recommend passing it in the URL specifically...

/foo/en-US/bar
/foo/es-MX/bar

And your routing can interpret the language and pass it as a parameter (see Scott's latest MVC push for this example). You'll then just have to set the ui culture on the current thread. Another method is to pull the languages from the browser (via http headers) and use the first language as their default ui culture.

matthaw

July 11. 2008 16:00

I think this extension does not work inside masterpage with local resources.

Zygimantas

August 1. 2008 08:42

Hi... nice code! i've included it in a web i'm making. However it seems to be impossible to include local (view) resources in the controller... correct? In the view code you say <%= Html.Resource("Name") %>, but in the controller, when you do the error checking you pull the error message from a generic strings resource... what i would like to know if it is possible to do something like the following in the controller...

error += String.Format(this.Resource("Strings, GenericRequiredError"), this.View.Resource("Name"));

where GenericRequiredError is a string like "The {0} field is required"...

No idea if my question is clear... I hope so, and thanks for the informative article!

davidinbcn

August 2. 2008 20:38

Please post the source code sample for this. Thanks!

tl

September 7. 2008 20:08

The new MVC Preview 5 has broken this code. The controller no longer has a reference to the view engine, and the view engine no longer has a ViewLocator. I just started looking at preview 5 so I don't have a fix myself yet or I'd post it.

Paul Wideman

September 11. 2008 14:13

Here is an ugly and temporary implementation which worked for me. I found the virtual folder as Preview 5 finds the view itself, just replace the GetVirtualPath(HtmlHelper htmlhelper) as below.

Hopefully this will be replaced with the next releases of the MVC.

private static string GetVirtualPath(HtmlHelper htmlhelper)
{
string virtualPath = null;
Controller controller = htmlhelper.ViewContext.Controller as Controller;

if (controller != null)
{
string controllerName = controller.ToString();
controllerName = controllerName.Substring(controllerName.LastIndexOf(".") + 1).Replace("Controller", "");
string viewName = htmlhelper.ViewContext.ViewName;

string[] viewLocationFormats = new[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};

foreach (string location in viewLocationFormats)
{
virtualPath = location.Replace("{0}", viewName).Replace("{1}", controllerName);
if (File.Exists(HttpContext.Current.Server.MapPath(virtualPath)))
{
break;
}
}
}

return virtualPath;
}

Kemal Eginci

September 27. 2008 08:04

Preview 5 clean GetVirtualPath method:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Compilation;
using System.Globalization;

namespace InternationalizationExample.Extensions
{
/// <summary>
/// Source: blog.eworldui.net/.../...T-MVC---Localization.aspx
///
/// Adapted by Maarten Balliauw
/// </summary>
public static class ResourceExtensions
{
public static string Resource(this HtmlHelper htmlhelper, string expression, params object[] args)
{
string virtualPath = GetVirtualPath(htmlhelper);

return GetResourceString(htmlhelper.ViewContext.HttpContext, expression, virtualPath, args);
}

public static string Resource(this Controller controller, string expression, params object[] args)
{
return GetResourceString(controller.HttpContext, expression, "~/", args);
}

private static string GetResourceString(HttpContextBase httpContext, string expression, string virtualPath, object[] args)
{
ExpressionBuilderContext context = new ExpressionBuilderContext(virtualPath);
ResourceExpressionBuilder builder = new ResourceExpressionBuilder();
ResourceExpressionFields fields = (ResourceExpressionFields)builder.ParseExpression(expression, typeof(string), context);

if (!string.IsNullOrEmpty(fields.ClassKey))
return string.Format((string)httpContext.GetGlobalResourceObject(
fields.ClassKey,
fields.ResourceKey,
CultureInfo.CurrentUICulture),
args);

return string.Format((string)httpContext.GetLocalResourceObject(
virtualPath,
fields.ResourceKey,
CultureInfo.CurrentUICulture),
args);
}

private static string GetVirtualPath(HtmlHelper htmlhelper)
{
string virtualPath = null;
Controller controller = htmlhelper.ViewContext.Controller as Controller;

if (controller != null)
{
ViewEngineResult result = FindView(controller.ControllerContext, htmlhelper.ViewContext.ViewName);
WebFormView webFormView = result.View as WebFormView;

if (webFormView != null)
{
virtualPath = webFormView.ViewPath;
}
}

return virtualPath;
}

private static ViewEngineResult FindView(ControllerContext controllerContext, string viewName)
{
// Result
ViewEngineResult result = null;

// Search only for WebFormViewEngine
WebFormViewEngine webFormViewEngine = null;
foreach (var viewEngine in ViewEngines.Engines)
{
webFormViewEngine = viewEngine as WebFormViewEngine;

if (webFormViewEngine != null)
break;
}

result = webFormViewEngine.FindView(controllerContext, viewName, "");
if (result.View == null)
{
result = webFormViewEngine.FindPartialView(controllerContext, viewName);
}

// Return
return result;
}
}
}

Maarten Balliauw

September 27. 2008 19:16

Why not just use Resources.<ClassName>.<ResourceKey>?

Steve Andrews

October 27. 2008 05:33

Everything works good except for resources which are stored in controls (.ascx files). GetVirtualPath method gets a reference for the aspx page on which a control is stored. How to get the reference to a control without overloading the helper metod like this public static string Resource(this HtmlHelper htmlhelper, string expression, string virtualPath, params object[] args) where virtual path comes directly from the ascx file?

Serg

December 13. 2008 05:47

Actually, this is enough for the GetVirtualPath method to work in Beta 1:

private static string GetVirtualPath(HtmlHelper htmlHelper)
{
string virtualPath = null;
WebFormView view = htmlHelper.ViewContext.View as WebFormView;

if (view != null)
{
virtualPath = view.ViewPath;
}
return virtualPath;
}

Dan Lewi Harkestad

January 18. 2009 23:27

Like Steve said:

Why not just use Resources.<ClassName>.<ResourceKey>?

I don't really get this. Why would one use error-prone string keys all over the place when you can get compile-time safe versions for the exact same thing? (+ you'll spend a lot less time implementing things like HtmlHelper extension methods)

Gino

February 12. 2009 06:27

@Gino, Steve

Resources.<ClassName>.<ResourceKey> is good, but not all resource keys are known at compile time. For example, I have resources to localize enum types. The key is built at runtime from myEnum.GetType().Name + "_" + myEnum.ToString()...

Dominic

February 12. 2009 06:46

Then why not use Resources.<ClassName>.<ResourceKey> where possible and something like this:

public static string Localize(this HtmlHelper helper, Enum value)
{
return Localize(helper, value, <defaultResourceManager>);
}
public static string Localize(this HtmlHelper helper, Enum value, ResourceManager resourceManager) { ... }

or even

public static string Localize(this Enum value) {...}

for enums?

Gino

March 10. 2009 22:35

As of ASP.NET MVC RC2, this code does not compile.
It fails on 'controller.ViewEngine' and says 'System.Web.Mvc.Controller' does not contain a definition for 'ViewEngine' and no extension method 'ViewEngine' accepting a first argument of type 'System.Web.Mvc.Controller' could be found (are you missing a using directive or an assembly reference?)'

Avi

March 20. 2009 01:20

Here is my solution of control's(.ascx) resources problem:

private static string GetVirtualPath(HtmlHelper htmlhelper) {
string virtualPath = null;
TemplateControl tc = htmlhelper.ViewDataContainer as TemplateControl;

if (tc != null) {
virtualPath = tc.AppRelativeVirtualPath;
}

return virtualPath;
}

Omen

March 23. 2009 02:03

Been working on an MVC project which i want it to be multilingual. People really say resources are the best way for multilingual in ASP.NET MVC. Thats have i came to this post. I makes sense to me and i do understand more about resources thanks for the post

Bayram Çelik

March 26. 2009 21:21

We tried to localize here at work using your methods and now my colleague has a resource stuck in his pooper. Now what?!

Faffy Fuck

April 12. 2009 05:50

NIce, soooo 1 ?) while in an English screen, can the user go to a combo box on the screen choose to see the page in Spanish, and then have the page rendered in Spanish, 2 ?) how about changing to spanish and not lossing data?

Fred

April 23. 2009 20:09

very body another mee.

nakliyat

April 27. 2009 00:50

Yep, all implementations of GetVirtualPath() here simply do not work in ASP.NET MVC Release 1.

Dmitri

May 9. 2009 11:49

very nices article.Adding videos sounds like an interesting idea, although I've never done that before. Any recommendations for a screen recording software?

saç ekimi

May 17. 2009 20:21

I cannot get this to pick up browser language. I've tried CultureInfo.CurrentCulture but it always reports en-GB or en-US. Am I missing something?

Paul

May 27. 2009 14:06

public static string Localize(this HtmlHelper helper, Enum value, ResourceManager resourceManager) { ... }

or even

public static string Localize(this Enum value) {...}

for enums?

halı yıkama

May 27. 2009 14:07

how about changing to spanish and not lossing data?

ankarahalı yıkama

May 27. 2009 14:08

As of ASP.NET MVC RC2, this code does not compile.

ankara nakliyat

May 27. 2009 14:09



Why not just use Resources.<ClassName>.<ResourceKey>

ankara nakliye

May 27. 2009 14:11

No idea if my question is clear... I hope so, and thanks for the informative article!

ankara evden eve nakliyat

May 27. 2009 14:12

As you can see, it supports both Global Resources and Local Resources. When working within your controller actions, only Global Resources work as we don't have a concept of a "local resource." The implementation for Html.Resource is actually a wrapper around the verbose method I previously mentioned. It does, however, take into consideration the expression syntax and the context of where the code is calling from to smartly determine the correct resource call to make. A gotcha in the codebase is that this code will only work with the WebFormViewEngine out of the box for local resources

izmir nakliyat

May 27. 2009 14:13

good article.

izmir evden eve nakliyat

May 27. 2009 14:13

thank you

digiturk

May 27. 2009 14:14

Under /Views/Products, create a "App_LocalResources", and 2 .resx files named "Create.aspx.resx" and "Confirm.aspx.resx".

digiturk başvuru

May 29. 2009 12:20

Something has happened to the download. When I grab it all the zip contains is 1 file (LocalizationHelpers.cs)

Jordan

June 6. 2009 06:02

Why not just use TemplateControl.GetLocalResourceObject/GetGlobalResourceObject in views or inherit ViewPage/ViewUserControl/ViewMasterPage and implement there something like:

public string GetLocalResourceString(string key)
{
var o = GetLocalResourceObject(key);
if (o != null)
{
return o.ToString();
}
return "?" + key + "?";
}

public string GetGlobalResourceString(string className, string key)
{
var o = GetGlobalResourceObject(className, key);
if (o != null)
{
return o.ToString();
}
return "?" + key + "?";
}

I think it's better than this approach which has major flaws when dealing with partial views and master pages.

Filip Kinsky

June 10. 2009 02:00

The light gray color of the font makes it hard to read... you should consider a better contrast

hugo

June 14. 2009 12:31

Can anyone of you tell me how to use extension in controller. I have tried it in the view and it works fine but not in the controller. In the view we create the resource file as index.aspx.resx but for controller what will be the name of the file and where we need to place the file.

Samoj Bhattarai

June 24. 2009 11:03

Hmmm. Must admit, Localization has slipped to the bottom of my list. This shows how easy it can be so might have to tackle that sooner rather than later.

Chris

July 4. 2009 07:36

A gotcha in the codebase is that this code will only work with the WebFormViewEngine out of the box for local resources<a href="http://www.ekintas.com" title="nakliyat">nakliyat</a>

nakliyat

July 18. 2009 01:38

his might be an unusual question, but is there any framework or at least some helper classes that would help me use GNU Gettext for localizing a C# ASP.NET MVC website? I've been using Gettext in a previous (managed code) project and really appreciate the possibility to use PoEdit for translating the resources.

download free roulette

July 18. 2009 22:53

thanks you

sex movies

July 19. 2009 07:46

Thank you for useful information was a good article

sex movies

July 21. 2009 00:58

thanks you

Porno izle

July 22. 2009 20:56

I've been using Gettext in a previous (managed code) project and really appreciate the possibility to use PoEdit for translating the resources.

Information Technology degree

July 22. 2009 20:56

you should consider a better contrast.

Fire Science degree

July 22. 2009 20:58

Thanks a lot for sharing such an valuable stuff.

Online GED

July 22. 2009 20:58

This is very useful information was a good article.

Online doctoral degree

July 22. 2009 20:59

thanks for sharing.

Fire degree

July 27. 2009 23:21

has happened to the download. When I grab it all the zip contains is 1 file

evden eve

July 28. 2009 03:29

Have you considered avoiding .Net localization techniques completely?

I am working on a project right now that has language localization in ASP.Net MVC. For this I decided to create a separate DLL that holds the resources in XML format. In the main project I have a special class that handles text retrieval. So all I have to do is call my code like this:

<%=lang.Get("header/about") %>

I find this technique quite easy to use and there's no verbosity.

Cyril Gupta

August 2. 2009 16:56

hi all.
thank too the apple. http://www.germanporn.tk

Porno filme

August 2. 2009 16:57

Thanks a lot for this scripot.I have been looking for it for a long time http://www.tvsexizle.com

Porno izle

August 9. 2009 20:04

very nices article.Adding videos sounds like an interesting idea, although I've never done that before. Any recommendations for a screen recording software?

tiffany

August 11. 2009 13:35

I'm using viagra for 5 years and I know almost everything about this pill. Viagra side effects are not so dramatic like all people say. It almost nothing to say about it...

viagra side effects

August 11. 2009 23:17

That localization helpers really help me. Thanks.

sd1200

August 18. 2009 15:37

burun estetiği ve burun ameliyatı

burun estetiği

August 18. 2009 15:52



Thank you very successful and useful
site I have received the necessary information
<a href="http://fuesacekimi.com">saç ekimi</a>

saç ekimi

August 25. 2009 10:13


Thank you very much very nice article
Great information! Very useful for me. Thanks a lot.
The idea is awesome. Congrats.
<a href="http://dorahospital.com">özel hastane</a>

özel hastane

August 28. 2009 22:55

Nice blog, just bookmarked it for later reference

buat blog

September 6. 2009 02:09

Keep it up, your writing is always a joy to read that I even told my friends. Simply loving this!

Make Money Online

September 18. 2009 05:34

MEF offers a great way for the .net developers to reuse applications and components thus it cause a great impact to lessen development time. Thanks for sharing.

Buy Research Paper

September 18. 2009 06:48


Thank you very successful and useful
site I have received the necessary information
<a href="http://dorahospital.com">özel hastane</a>

özel hastane

September 26. 2009 20:39

This localization tool is such a great help, when you need to find or localize the applications in different languages, it is really helpfull and can make your job much easier. thanks for sharing the info,please continue posting your finds on ASPNET-MVC.

Free Internet Advertising

September 28. 2009 00:31

Wow that helped out a lot, thanks man!

No Chexsystems Checking Account

September 29. 2009 05:01

Always leading the avant-garde of fashion without compromising traditional craftsmanship of luxury leather goods
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com ] louis vuitton [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com ] Louis Vuitton Replica [/url]
[url=http://www.tiffanysilverworld.com ] Tiffany Jewelry [/url]
[url=http://www.tiffanycoltd.com ] Tiffany Jewelry [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com ] Louis Vuitton outlet [/url]is also active in other ...Cheap
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com ] Louis Vuitton Replica [/url] Handbags,Purses,Wallets Outlet and
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com ] Louis Vuitton Replica [/url]Designer Bags,Shoes Outlet Store - discount price is our special offer, [url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com ] Louis Vuitton Outlet [/url]
[url=http://www.luxesaler.com ] louis vuitton [/url]
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com ] louis vuitton sale [/url]
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com ] louis vuitton online shop [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com/articles/Louis-Vuitton-Wallets.html ] louis vuitton wallet [/url] is also
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com/products/17495.html ] louis vuitton [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com ] Louis Vuitton Speedy [/url]
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com/articles/Cheap-Louis-Vuitton.html ] cheap louis vuitton [/url]
[url=http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com" rel="nofollow">http://www.favorluxury.com/articles/Discounted-Louis-Vuitton.html ] Discounted Louis Vuitton [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com/articles/Louis-Vuitton-Online-Shop.html ] Louis Vuitton Online Shop [/url]
[url=http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com" rel="nofollow">http://www.louisvuittonlive.com/articles/Louis-Vuitton-Sale.html] Louis Vuitton sale [/url]

cheap louis vuitton

September 30. 2009 12:48

Interesting findings.

cd rates

October 4. 2009 01:13

<a title="العاب بنات" href="http://www.al3abdolls.com/">العاب بنات</a> -
<a title="العاب طبخ" href="http://www.al3abdolls.com/games2.htm">العاب طبخ</a> -
<a title="العاب" href="http://games.jeddahbikers.com/">" rel="nofollow">http://games.jeddahbikers.com/">العاب</a> -
<a title="العاب سيارات" href="http://games.jeddahbikers.com/Game/11/11">العاب سيارات</a>
- <a title="العاب اكشن" href="http://games.jeddahbikers.com/Game/7/7">العاب اكشن</a>
- <a title="يوتيوب" href="http://youtube.jeddahbikers.com/">يوتيوب</a> -
<a title="موقع صور" href="http://pic.jeddahbikers.com">موقع صور</a> -
<a title="منتدى" href="http://www.jeddahbikers.com/vb/">منتدى</a> -
<a title="توبيكات" href="http://www.jeddahbikers.com/vb/f71/">توبيكات</a> -
<a title="برامج" href="http://www.jeddahbikers.com/vb/f17/">برامج</a> -
<a title="العاب اطفال" href="http://games.jeddahbikers.com/Game/3/3">العاب اطفال</a>
- <a title="العاب تلوين" href="http://dolls.jeddahbikers.com/Dollz9.htm">العاب تلوين</a>
-<a title="العاب مكياج" href="http://dolls.jeddahbikers.com/Dollz3.htm"> العاب مكياج</a>
- <a title="العاب باربي" href="http://dolls.jeddahbikers.com/Dollz4.htm">العاب باربي</a>
- <a title="العاب تلبيس" href="http://dolls.jeddahbikers.com/Dollz2.htm">العاب تلبيس</a>
-&nbsp; <a title="العاب بنات" href="http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">العاب بنات</a>
-<a title="العاب طبخ" href="http://dolls.jeddahbikers.com/Dollz1.htm"> العاب طبخ</a>
- <a title="games" href="http://m6m.com">games</a> -
<a title="girls games" href="http://m6m.com/girls-games/">girls games </a>-
<a title="action games" href="http://m6m.com/action-games/">action games </a>-
<a title="kids games" href="http://m6m.com/kids-games/">kids games</a> -
<a title="racing games" href="http://m6m.com/racing-games/">racing games</a> -
<a title="sport games" href="http://m6m.com/sport-games/">sport games</a> -
<a title="cooking games" href="http://m6m.com/cooking-games/">cooking games</a>
- <a title="free games" href="http://m6m.com/free-games/">free games</a> -
<a title="crash bandicoot" href="m6m.com/.../">crash
bandicoot</a> - <a title="hguhf" href="http://hguhf.biz">hguhf</a> -
<a title="العاب" href="http://al3ab.a9fr.net">العاب</a> -
<a title="دليل" href="http://links.jeddahbikers.com/">دليل</a> -<a title="دليل تن" href="http://xn----5mcn8faoy.com/">
دليل تن</a> - <a title="العاب دولز" href="http://www.anshor.com">العاب دولز</a>
- <a title="صور بنات" href="http://dolls.jeddahbikers.com/pictures/">صور بنات</a>
- <a title="تحميل صور" href="http://center.jeddahbikers.com">تحميل صور</a> -
<a title="حركتات" href="http://www.7rkt.at">حركتات</a> -
<a title="توبيكات اغاني" href="http://www.jeddahbikers.com/vb/f79/">توبيكات اغاني</a>
- <a title="توبيكات رومانسية" href="http://www.jeddahbikers.com/vb/f80/">توبيكات
رومانسية</a> - <a title="صور" href="http://www.jeddahbikers.com/vb/f50/">صور</a>
- <a title="العاب فلاش" href="http://games.jeddahbikers.com/">" rel="nofollow">http://games.jeddahbikers.com/">العاب فلاش</a> -
<a title="العاب فراولة" href="http://farwla.com">العاب فراولة</a> -<a title="العاب سونيك" href="http://www.al3absonic.com">
العاب سونيك</a> -<a title="لعبة ماريو" href="http://games.jeddahbikers.com/270.html">
لعبة ماريو</a> - <a title="قيمزر" href="http://games.jeddahbikers.com/236.html">
قيمزر</a> - <a title="العاب" href="http://xn----ymcabadd4ke8hf.com/">العاب</a>
<a title="العاب بنات" href="http://games.jeddahbikers.com/Game/8/8">العاب البنات</a>
- <a title="العاب قص شعر" href="http://dolls.jeddahbikers.com/Dollz6.htm">العاب
قص الشعر</a> -
<a title="العاب ديكور" href="http://dolls.jeddahbikers.com/Dollz8.htm">العاب ديكور</a>
- <a title="العاب بنات جديدة" href="http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">العاب بنات جديدة</a>
- <a title="العاب" href="http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">" rel="nofollow">http://dolls.jeddahbikers.com/">العاب</a> -
<a title="ابتسامات" href="http://smile.jeddahbikers.com/">ابتسامات</a> -
<a title="dress up games" href="m6m.com/play/dressup-games/">dressup games</a>

voodoo

October 4. 2009 08:42

This is a really great post you have here. Keep up the good work you writing skills are dynamic.

legitimate work at home jobs opportunity

October 6. 2009 12:53

I think this extension does not work inside masterpage with local resources.

auto insurance

October 6. 2009 19:03

Localization Helpers are often over looked. I'm glad you reminded me how useful they can be. Thanks!

Snuggie

October 8. 2009 11:31

Buy Sildenafil Citrate Online

Viagra

October 9. 2009 21:16

This is a really great post you have here

Live sport scores

October 9. 2009 21:16

I think this extension does not work inside masterpage with local resources.

football live score

October 9. 2009 21:17

Buy Sildenafil Citrate Online

cricket live scores

October 9. 2009 21:17

This is a really great post you have here. Keep up the good work you writing skills are dynamic.

live scores basketball

October 9. 2009 21:18

Interesting findings.

hockey live scores

October 9. 2009 21:18

Thank you very successful and useful

UK kamagra wholesale

October 9. 2009 21:20

Keep it up, your writing is always a joy to read that I even told my friends. Simply loving this!

kamagra supplier

October 9. 2009 21:20

good article.

viagra wholesaler

October 10. 2009 12:38

Thanks for sharing informations.Looking forward to more stuff.

street lamps

October 10. 2009 17:42

I bookmarked your post will read this latter


Regards

Lone

mobile phone wholesale

October 11. 2009 05:00

Thanks for posting, good information, looking forward to seeing more!

find the best <a href="http://www.monitorbankrates.com/">CD" rel="nofollow">http://www.monitorbankrates.com/">CD rates</a>
find the highest<a href="http://www.monitorbankrates.com/">CD" rel="nofollow">http://www.monitorbankrates.com/">CD rates</a>

SteveB

October 11. 2009 05:01

Thanks for posting

Bank CD Rates

October 11. 2009 05:01

Thanks for sharing, good post!

Best CD Rates

October 12. 2009 20:01

I love the way you post your thoughts - amazing.

California web design

October 13. 2009 16:32

I made a change that got this working for me with MVC 1.0 and master pages if anyone is interested.

I replaced the code to find the VirtualPath with:

((WebFormView)htmlhelper.ViewContext.View).ViewPath


Great idea with the HTML helpers by the way, this works a charm.

Marshall Jones

October 14. 2009 13:17

Is this still working with ASP.NET MVC 1.0?

Herbalife

October 14. 2009 20:25

This is obviously one great post. Thanks for the valuable information and insights you share

online games

October 16. 2009 21:58

I think this extension does not work inside masterpage with local resources

free online games

October 19. 2009 13:09

When is the next post comming on this topic.


Regards

Fresh

hotel malaga spain

October 20. 2009 05:56

fittings http://www.valves-fittings.com/" rel="nofollow">http://www.valves-fittings.com/sanitary-fittings.html" rel="nofollow">www.valves-fittings.com/sanitary-fittings.html
Valves manufacturer http://www.valves-fittings.com/" rel="nofollow">http://www.valves-fittings.com/
ball valves http://www.valves-fittings.com/" rel="nofollow">http://www.valves-fittings.com/sanitary-ball-valves.html
Valves supplier http://www.valves-fittings.com/" rel="nofollow">http://www.valves-fittings.com/
butterfly valves http://www.valves-fittings.com/" rel="nofollow">http://www.valves-fittings.com/sanitary-butterfly-valves.html
water treatment chemicals http://www.leadbondchem.com" rel="nofollow">http://www.leadbondchem.com
wastewater treatment chemicals http://www.leadbondchem.com" rel="nofollow">http://www.leadbondchem.com
flocculants http://www.leadbondchem.com" rel="nofollow">http://www.leadbondchem.com/decolorizing-flocculant.html
flocculant http://www.leadbondchem.com" rel="nofollow">http://www.leadbondchem.com/decolorizing-flocculant.html
permanent magnets http://www.stanfordmagnets.com
rare earth magnets http://www.stanfordmagnets.com/nd-fe-b.html
imanes permanentes http://es.stanfordmagnets.com/
aimants permanents http://fr.stanfordmagnets.com/
micro switches http://www.american-switches.com

valves supplier

October 20. 2009 07:59

I posted your article to my myspace profile.


Regards

Jenki

pass drug test

October 20. 2009 10:02

I added your post to my college Report


Regards

Green

business loan

October 21. 2009 01:23

So difficult

ed hardy

October 21. 2009 03:43

very good.thanks for post.

valves manufacturer

October 21. 2009 03:43

I hate asp.net

ball valves

October 21. 2009 03:46

very good code.

fittings

October 21. 2009 03:52

good.

butterfly valves

October 21. 2009 03:53

thanks for post.

permanent magnets

October 21. 2009 03:54

write very good.

rare earth magnets

October 21. 2009 15:18

Thank you once again, i am really very much happy to have found your blog and honored to have been posting comments here.

underground electric dog fence

Comments are closed

Copyright © 2000 - 2010 , Excentrics World