ASP.net MVC пользовательский обработчик/ограничение маршрута

Некоторые компиляторы обеспечивают доступ к флагу целочисленного переполнения в ЦП, который Вы могли тогда протестировать, но это не стандартно.

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

if ( b > ULONG_MAX / a ) // a * b would overflow
13
задан womp 18 July 2009 в 20:43
поделиться

1 ответ

Как вы упомянули, универсальный параметр может появляться только в конце маршрута - опубликованный вами код вызовет ошибку времени выполнения и покажет вам желтый экран смерти. если вы даже попытаетесь запустить свое приложение.

Существует несколько точек расширения для создания пользовательских сценариев маршрутизации. Это - Route, RouteBase и IRouteHandler.

Вы можете создать сгенерированный список маршрутов для обработки, расширив RouteBase. Обычно вы следуете шаблону, когда конструктор принимает ресурс (имя контроллера), а затем назначает ему список маршрутов, за которые он отвечает, а затем отображает его в вашем global.asax. Вот пример кода, из которого вы можете построить:

public class MyRoute : RouteBase
{
    private List<Route> _routes = new List<Route>();

    public MyRoute(string resource)
    {
        // make a Resource property, not shown in this example
        this.Resource = resource;

        // Generate all your routes here
        _routes.Add(
            new Route("some/url/{param1}",
            new McvRouteHandler {
                Defaults = new RouteValueDictionary(new {
                    controller = resource,
                    action = actionName
                }),
            Constraints = new RouteValueDictionary()
        );
        _routes.Add(...); // another new route   
    }

    public override RouteData GetRouteData(HttpContextBase context)
    {
        foreach (var route in _routes)
        {
            var data = route.GetRouteData(context);
            if (data != null)
            { 
                return data;
            }
        }
        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd)
    {
        foreach (var route in _routes)
        {
            var path = route.GetVirtualPath(context, rvd);
            if (path != null)
            { 
                return path;
            }
        }
        return null;
    }
}

Чтобы использовать свой класс маршрутизации, выполните routes.Add (new MyRoute ("page1")); в вашем Global.asax.

Если вам нужен еще больший контроль, вы можете реализовать IRouteHandler и вместо создания MvcRouteHandlers () для ваших маршрутов, как показано в приведенном выше примере, используйте свой собственный IRouteHandler. Это позволит вам переопределить логику выбора контроллера из данных запроса.

Вся структура чрезвычайно расширяема, но вам нужно будет немного изучить, чтобы делать это правильно. Я бы посоветовал просто изменить ваш URL-адрес, если это возможно, чтобы по возможности воспользоваться параметром catch-all.

но вам нужно будет немного узнать, чтобы делать это правильно. Я бы посоветовал просто переставить URL-адреса, если это возможно, чтобы по возможности воспользоваться параметром catch-all.

но вам нужно будет немного узнать, чтобы делать это правильно. Я бы посоветовал просто переставить URL-адреса, если это возможно, чтобы по возможности воспользоваться параметром catch-all.

15
ответ дан 2 December 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: