2010-05-27 70 views
7

從ASP.NET MVC內部有可能根據訪問設備/瀏覽器路由到不同的控制器或操作?基於Web瀏覽器/設備(例如iPhone)的ASP.NET MVC路由

我正在考慮爲我的網站設置的某些部分替代操作和視圖,以防從iPhone進行訪問以優化其顯示和功能。我不想爲iPhone創建完全獨立的項目,因爲大多數網站在任何設備上都很好。

任何想法如何做到這一點?

+0

這可以幫助你 http://www.hanselman.com/blog/IntroducingASPNETFriendlyUrlsCleanerURLsEasierRoutingAndMobileViewsForASPNETWebForms.aspx – Ammar 2012-09-12 13:28:20

回答

0

最好的辦法是自定義操作過濾器。

您只需要繼承ActionMethodSelectorAttribute,並覆蓋IsValidRequest類。

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

然後

[IphoneRequest] 
public ActionResult Index() 
+0

哦,我想摸出如果設備是iphone: 串劑= controllerContext.HttpContext.Request.UserAgent; return agent.Contains(「iPhone」) – RPM1984 2010-05-27 06:07:06

1

您可以創建一個路由約束類:

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); 
    } 
} 

然後強制約束到像這樣的途徑之一:

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

然後,您可以創建另一條路線指向具有不同約束或不約束的另一個命名空間中具有相同名稱的控制器。