Hola a todos, hoy quiero mostrar un pequeño “tip” con el cual es posible personalizar los templates que usamos tanto en ASP.NET MVC y Web API para que se adecuen más a lo que necesitamos.

Por ejemplo, es bastante común que se defina una clase base de la cual hereden los controladores, dicha clase base es la que hereda de Controller para MVC o de ApiController cuando es Web API.

Lo primero es que vamos a crear una clase base llamada BaseController, la cual para el demo solo va a hereder de Controller pero puedes tener objetos que requieras en todos tus controladores:


public abstract class BaseController : Controller {}

Luego de definir la clase, creamos una nueva carpeta llamada CodeTemplates en la cual vamos a tener la pantilla personalizada. Ahora, debemos ir a la ruta de instalación de Visual Studio y allí buscar las plantillas, generalmente la ruta es: C:Program Files (x86)Microsoft Visual Studio 12.0Common7IDEExtensionsMicrosoftWebMvcScaffoldingTemplates, allí por cada plantilla existe una carpeta que contiene la definición tanto C# como para Visual Basic del template, dichos archivos son plantillas T4.

Para el ejemplo vamos a personalizar la plantilla que genera unMVC Controller vacío, para ello copiamos la carpetaMvcControllerEmpty a la carpeta CodeTemplates que creamos en el punto anterior, como vamos a seguir usando C# podemos eliminar de nuestro proyecto la plantilla que corresponde a Visual Basic, es decir el archivo Controller.vb.t4, la solución se debe ver:

customtemplates

Ahora, para personalizar la plantilla abrimos el archivo T4 que inicialmente luce:


<#@ template language="C#" HostSpecific="True" #>
<#@ output extension="cs" #>
<#@ parameter type="System.String" name="ControllerName" #>
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="Namespace" #>
<#@ parameter type="System.String" name="AreaName" #>
<#
string routePrefix;
if (String.IsNullOrEmpty(AreaName))
{
    routePrefix = ControllerRootName;
}
else
{
    routePrefix = AreaName + "/" + ControllerRootName;
}
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace <#= Namespace #>
{
    public class <#= ControllerName #> : Controller
    {
        // GET: <#= routePrefix #>
        public ActionResult Index()
        {
            return View();
        }
    }
}

Los cambios que vamos a hacer son:

  • Cambiar la clase para que hereden de BaseController
  • Añadir el atributo [Authorize] al controlador
  • A la acción Index añadirle los atributos [HttpGet] y [AllowAnonymous]

Luego de implementar los cambios anteriores la T4 se ve como:


<#@ template language="C#" HostSpecific="True" #>
<#@ output extension="cs" #>
<#@ parameter type="System.String" name="ControllerName" #>
<#@ parameter type="System.String" name="ControllerRootName" #>
<#@ parameter type="System.String" name="Namespace" #>
<#@ parameter type="System.String" name="AreaName" #>
<#
string routePrefix;
if (String.IsNullOrEmpty(AreaName))
{
    routePrefix = ControllerRootName;
}
else
{
    routePrefix = AreaName + "/" + ControllerRootName;
}
#>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace <#= Namespace #>
{
    [Authorize]
    public class <#= ControllerName #> : BaseController
    {
        [HttpGet]
        [AllowAnonymous]
        public ActionResult Index()
        {
            return View();
        }
    }
}

Para validar que los cambios sean correctos, añadimos un nuevo controlador usando la plantillaMVC 5 Controller – Empty:

customtemplates2

Luego asignamos un nombre al controlador, una vez finalizado el proceso lo que tenemos es un nuevo controlador que tiene los cambios realizados sobre la plantilla:


[Authorize] 
public class HomeController : BaseController 
{ 
    [HttpGet] 
    [AllowAnonymous] 
    public ActionResult Index() 
    { 
        return View(); 
    } 
}

Espero el post les sea interesante y no te olvides de compartir!

Saludos!