ASP.NET MVC Localization: Generate resource files and localized views using custom templates

Use ASP.NET MVC T4 custom templates to generate resource files and localized views.

Table of contents

Overriding ASP.NET MVC custom templates

The Add View dialog perform code generation that use T4 templates behind the scenes. These templates can be modified to customize the generated code from these tools. You can also add custom templates.

Basically you have to copy the default templates to your project. This is the path:

[Visual Studio Install Directory]\Common7\IDE\ItemTemplates\[CSharp | VisualBasic]\Web\MVC\CodeTemplates\

I have created a custom template that generates resource files (.resx), and I have modified the default templates to use the generated resource files.

Views Templates

You can find more information here:

T4 Templates: A Quick-Start Guide for ASP.NET MVC Developers

Understanding .resx file format

From MSDN [1]:

The .resx resource file format consists of XML entries, which specify objects and strings inside XML tags. One advantage of a .resx file is that when opened with a text editor (such as Notepad or Microsoft Word) it can be written to, parsed, and manipulated.(…) Each entry is described as a name/value pair.(…) When a string is added to a .resx file, the name of the string is embedded in a <data> tag, and the value is enclosed in a <value> tag

For a resource file like this:

You have the corresponding XML:

I created a custom template that generates the resource file in the specified format.

Continue reading

Entity Framework and T4: Generate Query Objects on the fly, part 1

Generate Query Objects on the fly for your Entity Framework entities using T4 templates. Don’t worry about LINQ, let the objects do all the work for you.

Table of contents

  • Configuration
  • References
  • Downloads
  • I’ve read some stuff about T4 templates in the last 2-3 years, but only recently I decided to give it a try. My first attempt was to generate Query Objects for Entity Framework, that’s what I’ll talk about in this article – what’s their purpose and how to use them.

    In part 2 I’ll create a demo ASP.NET MVC application that uses query objects created with this template. I already have another T4 template that creates javascript objects for my entities, and I’m developing a custom ASP.NET view template for those objects.

    Many thanks to Colin Meek [4], his work has really helpful.

    What is a Query Object?

    A Query Object is an object that represents a database query [1]:

    A Query Object is an interpreter [Gang of Four], that is, a structure of objects that can form itself into a SQL query. You can create this query by referring to classes and fields rather than tables and columns. In this way those who write the queries can do so independently of the database schema and changes to the schema can be localized in a single place.

    Assuming that you have a repository like this (I’m using this implementation):

    public IQueryable All<T>(Expression<Func<bool, T>> expression) where T : class
    

    Instead of:

    var albuns = from x in repository.All<Album>()
                     where x.Artist.Name == "Metallica"
                     && x.Genre.Name.Contains("Metal")
                     && x.Price >= 5 && x.Price
                     select x;
    

    You can do this way:

    var search = new AlbumSearch();
    search.PriceFrom = 5;
    search.PriceTo = 10;
    search.Artist = new ArtistSearch(){ Name = "Metallica" };
    search.Genre = new GenreSearch(){ NameContains = "Metal" };
    
    var albuns = from x in repository.All<Album>(search.GetExpression())
                      select x;
    

    Continue reading

    Xml serialization using generics

    Serialize/deserialize your objects using generics. Customize settings like indentation, encoding, namespaces and others.

    Table of contents

  • References
  • Downloads
  •  

    XML Serialization Overview

    XML serialization is the process of converting an object into a XML string in order to persist it to memory, a database, or a file. Its main purpose is to save the state of an object in order to be able to recreate it when needed. The reverse process is called deserialization.

    Some good uses for XML serialization/deserialization are [1]:

    • Storing user preferences in an object
    • Maintaining security information across pages and applications
    • Modification of XML documents without using the DOM
    • Passing an object from one application to another
    • Passing an object from one domain to another
    • Passing an object through a firewall as an XML string

     

    A generic serializer class – XmlSerializer<T>

    I’ve created a generic class to serialize/deserialize XML:

    XmlSerializer

    This class allows us to:

    • Serialize an object to a XML string
    • Deserialize an object from a XML string
    • Serialize an object to a XML file
    • Deserialize an object from a XML file

    It’s also possible to customize some settings like indentation, encoding, namespaces and others (see examples below).

    Continue reading