2010-05-27 11 views
7

Ist es möglich, innerhalb von ASP.NET MVC auf die verschiedenen Controller oder Aktionen basierend auf dem zugreifenden Gerät/Browser zu routen?ASP.NET MVC-Route basierend auf Webbrowser/Gerät (z. B. iPhone)

Ich denke über die Einrichtung von alternativen Aktionen und Ansichten für einige Teile meiner Website für den Fall, dass es vom iPhone zugegriffen wird, um die Anzeige und die Funktionalität zu optimieren. Ich möchte jedoch kein komplett separates Projekt für das iPhone erstellen, da die Mehrheit der Website auf jedem Gerät in Ordnung ist.

Irgendeine Idee, wie man das macht?

+0

Dies kann Ihnen helfen http://www.hanselman.com/blog/IntroducingASPNETFriendlyUrlsCleanerURLsEasierRoutingAndMobileViewsForASPNETWebForms.aspx – Ammar

Antwort

0

Am besten wäre eine benutzerdefinierte Aktion Filter.

Alles, was Sie tun müssen, ist von ActionMethodSelectorAttribute erben, und überschreiben Sie die IsValidRequest Klasse.

public class [IphoneRequest] : ActionMethodSelectorAttribute 
    { 
     public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
     { 
      // return true/false if device is iphone 

Dann in Ihrem Controller

[IphoneRequest] 
public ActionResult Index() 
+0

Oh, und ich denke, zu arbeiten, wenn das Gerät iphone ist: String agent = controllerContext.HttpContext.Request.UserAgent; return agent.Contains ("iPhone") – RPM1984

1

Sie können eine Route Constraint-Klasse erstellen:

public class UserAgentConstraint : IRouteConstraint 
{ 
    private readonly string _requiredUserAgent; 

    public UserAgentConstraint(string agentParam) 
    { 
     _requiredUserAgent = agentParam; 
    } 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return httpContext.Request.UserAgent != null && 
       httpContext.Request.UserAgent.ToLowerInvariant().Contains(_requiredUserAgent); 
    } 
} 

Und dann, wie so die Einschränkung eine der Routen erzwingen:

 routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new {id = RouteParameter.Optional}, 
      constraints: new {customConstraint = new UserAgentConstraint("Chrome")}, 
      namespaces: new[] {"MyNamespace.MVC"} 
      ); 

Sie könnten dann eine andere Route erstellen verweist auf einen Controller mit demselben Namen in einem anderen Namespace mit einer anderen oder keiner Einschränkung.

Verwandte Themen