RSS FeedFeed TwitterTwitter XINGXING
  
Meine Bücher

Moderne Webanwendungen mit ASP.NET MVC - ASP.NET MVC im Einklang mit ASP.NET Web API, Entity Framework und JavaScript-APIs,
Microsoft Press

Weitere Infos

 

Verteilte Systeme und Services mit .NET 4.5: Konzepte und Lösungen für WCF 4.5 und ASP.NET Web-API ,
Hanser Fachbuchverlag

Weitere Infos

 
Weitere Bücher
Meine Artikel

Last-Minute-Ticket: Neuerungen in der finale Version von ASP.NET Web API,
windows.developer

Weitere Infos

 

Windows Azure Tutorial: Von der Migration bis zur Cloud-Applikation,
iX - Magazin für professionelle Informationstechnik

Weitere Infos

 

EAI and EDI in the Cloud: Prospects of Azure Service Bus EAI & EDI – Part I,
Service Technology Magazine

Weitere Infos

 

Weitere Artikel

Schulung & Beratung

Gemeinsam mit meinen Kollegen aus dem IT-Visions Netzwerk unterstützte ich durch zielgerichtete Inhouse-Trainings und Consulting Unternehmen bei der Planung und Umsetzung großer Software-Systeme mit der Microsoft/.NET-Plattform.

 
Konferenzen

BASTA! 2013 von 23.09.2013 bis 27.09.2013 in Mainz

Meine Talks

Web-Site der Konferenz

 

Scandinavian Developer Conference 2013 (SDC 2013) von 04.03.2013 bis 06.03.2013 in Göteborg

Meine Talks

Web-Site der Konferenz

 

5th SOA and Cloud-Technology Symposium 2012 von 24.09.2012 bis 25.09.2012 in London

Meine Talks

Web-Site der Konferenz

 
Weitere Konferenzen
von Manfred, 22. September 2011 23:37
Die Möglichkeit des Url-Mappings bringt in ASP.NET einige nette Möglichkeiten mit sich. Macht man davon jedoch, zum Beispiel im Zuge der Implementierung von REST-Services, intensiv Gebrauch, wirkt die Tatsache, dass das Mapping nicht im Rahmen der Action-Methoden sondern Global.asax zu hinterlegen ist, nervig. Aus diesem Grund habe ich mich diese Woche an der Implementierung eines UrlMapping-Attributes versucht. Dieses wird wie nachfolgend dargestellt verwendet:
public class FlugRessourceController : Controller
{

    [UrlMapping("/fluege/{flugId}/buchungen")]
    public ActionResult Buchungen(int flugId)
    {
        var rep = new Repository();
        var fluege = rep.FindBuchungenByFlugId(flugId);
        return Json(fluege, JsonRequestBehavior.AllowGet);
    }
}
Das Attribut an sich gestaltet sich relative einfach. 
public class UrlMappingAttribute: Attribute
{
    public UrlMappingAttribute(string url)
    {
        Url = url;
    }
 
    public String Url { get; set; }
 
}
Um es „zum Leben zu erwecken“, habe ich die nachfolgend dargestellte Erweiterungsmethode MapController<T> entwickelt. Sie nimmt den Typ eines Controllers als Typ-Parameter entgegen und erstellt dafür anhand der in den UrlMapping-Attributen enthaltenen Informationen Routen.
public static class UrlMappingRouteCollectionTools
{
    public static void MapController<T>(this RouteCollection routes) where T : IController
    {
        var controller = typeof(T);
        var methods = controller.GetMethods();
        int i = 0;
        foreach (var method in methods)
        {
            Debug.WriteLine(method.Name);
 
            var attribute = method.GetCustomAttributes(inherit: false)
                                    .Where(a => a is UrlMappingAttribute)
                                    .FirstOrDefault();
 
            if (attribute == null) continue;
 
            var urlMappingAttribute = attribute as UrlMappingAttribute;
 
            var controllerName = RemovePostfix(controller.Name, "Controller");
            var url = RemovePrefix(urlMappingAttribute.Url, "/");
            var routeName = CreateRouteName<T>(method, ++i);
            var actionName = method.Name;
 
            routes.MapRoute(
                routeName,
                url,
                new { controller = controllerName, action = actionName }
            );
        }
    }
 
    private static string RemovePostfix(string str, string postfix)
    {
        if (str.EndsWith(postfix)) {
            str = str.Substring(0, str.Length - postfix.Length);
        }
        return str;
    }
 
    private static string RemovePrefix(string str, string prefix)
    {
        if (str.StartsWith(prefix))
        {
            str = str.Substring(prefix.Length, str.Length - prefix.Length);
        }
        return str;
    }
 
    private static string CreateRouteName<T>(System.Reflection.MethodInfo m, int number) where T : IController
    {
        return typeof(T).Name + "_" + m.Name + "_autogenerated_" + number;
    }
}
Diese Methode kann man nun in der Global.asax in der Methode RegisterRoutes aufrufen und schon kommt man in den Genuss der über die Attribute definierten Routen.
public static void RegisterRoutes(RouteCollection routes)
{
 
    routes.MapController<FlugRessourceController>();
        […]
}

Kategorien: ASP.NET MVC