ASP.NET MVC Route на основе веб-браузера / устройства (например, iPhone) - PullRequest
7 голосов
/ 27 мая 2010

Возможно ли из ASP.NET MVC выполнять маршрутизацию на разные контроллеры или действия на основе доступа к устройству / браузеру?

Я думаю о настройке альтернативных действий и представлений для некоторых частей моего веб-сайта на случай, если к нему обращаются с iPhone, чтобы оптимизировать его отображение и функциональность. Я не хочу создавать совершенно отдельный проект для iPhone, хотя большинство сайтов подойдет для любого устройства.

Есть идеи, как это сделать?

Ответы [ 3 ]

1 голос
/ 27 мая 2010
1 голос
/ 21 февраля 2013

Вы можете создать класс ограничения маршрута:

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

Затем можно создать другой маршрут, указывающий на контроллер с тем же именем в другом пространстве имен с другим ограничением или без него.

0 голосов
/ 27 мая 2010

Лучшей ставкой будет пользовательский фильтр действий.

Все, что вам нужно сделать, это наследовать от 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()
...