Una delle cose più affascinanti di Asp.Net MVC è la facilità con cui è possibile estendere il framework creando ad esempio dei propri ActionFilter
, HtmlHelper
o ActionResult
.
ActionResult
Partiamo dall'esempio classico di voler realizzare un ActionResult per restituire dei feed RSS: ci basta estendere la classe base astratta ActionResult
e implementare il metodo ExecuteResult
.
public class RssActionResult : ActionResult
{
public SyndicationFeed Feed { get; set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "application/rss+xml";
Rss20FeedFormatter rssFormatter = new Rss20FeedFormatter(Feed);
using (XmlWriter writer=XmlWriter.Create(context.HttpContext.Response.Output))
{
rssFormatter.WriteTo(writer);
}
}
}
Nel nostro caso il .NET Framework ci mette a disposizione la classe RSS20FeedFormatter che fa tutto il lavoro per noi ma chiaramente l'unico limite è solo la fantasia, o meglio ancora i nostri requisiti!
Per gli ActionFilter
si tratta di estendere la classe ActionFilterAttribute
e fornire una propria implementazione degli eventi scatenati durante il ciclo di vita dell'action decorata:
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
Supponiamo ad esempio di voler tracciare l'esecuzione di una action:
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("{0} - Action eseguita!", DateTime.Now);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("{0} - Action in esecuzione!", DateTime.Now);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Debug.WriteLine("{0} - Action Result eseguita!", DateTime.Now);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Debug.WriteLine("{0} - Action Result in esecuzione!", DateTime.Now);
}
}
Applicando questo filtro ad una qualsiasi action potremmo analizzare le varie fasi della sua esecuzione.
Html Helper
Anche gli Html Helpers sono un notevole punto di estensione del framework perché ci permettono di controllare l'output generato durante la fase di rendering della view fornendo al contempo un modo comodo di realizzare le viste dell'applicazione. In questo caso la procedura da seguire è ancora più semplice perché basta creare degli extension method della classe HtmlHelper:
public static class MyHtmlHelpers
{
public static string Titolo(this HtmlHelper html, string titolo)
{
return string.Format("<h1>{0}</h1>", titolo);
}
}
Per utilizzare l'helper dobbiamo solamente importare il namespace nella view e utilizzarlo come gli altri html helpers, come sempre l'autocompletamento di Visual Studio verrà in nostro aiuto:
<%@ Import Namespace="Il_namespace_degli_helpers" %>
Su internet è possibile trovare un bel po' di estensioni per il framework MVC e sicuramente il riferimento da questo punto di vista è MVC Contrib su codeplex, un insieme di contributi raccolti in un'unica libreria che può sicuramente tornarvi utile durante lo sviluppo delle vostre applicazioni.