Добавить запаздывающую наклонную черту в конце каждого URL?

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

существует интерфейс между электрическими устройствами и электросетью - это набор соглашений о форме разъемов и сокетов и напряжений/токов через них. Если Вы захотите реализовать новое электрическое устройство, пока Ваш разъем следует правилам, то он будет в состоянии получить сервисы от сети. Это делает расширяемость очень легкий и удаляет, или понижает затраты на координацию : Вы не должны уведомлять поставщика электроэнергии о том, как Ваше новое устройство работает, и придите к отдельному соглашению о том, как включить Ваше новое устройство в сеть.

Страны имеют стандартные ширины рельсовой колеи. Это позволяет разделение труда между машиностроительными компаниями, которые положили направляющие и машиностроительные компании, которые создают поезда для работы тех направляющих, и оно позволяет железнодорожным компаниям к замена, и обновите поезда, не повторно проектируя целую систему.

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

Примеры от природы: я не слишком увлечен тем, чтобы есть (), makesSound (), перемещения (), и т.д. примеры. Они действительно описывают поведение, которое корректно, но они не делают , описывают взаимодействия и как им включают . Очевидные примеры интерфейсов, которые включают взаимодействия по своей природе, относятся к воспроизведению, например, цветок предоставляет определенный интерфейс пчеле так, чтобы опыление могло произойти.

30
задан Community 23 May 2017 в 12:02
поделиться

1 ответ

Вы можете создать новый маршрут, который переопределяет метод GetVirtualPath . В этом методе вы добавляете завершающую косую черту к VirtualPath . Примерно так:

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
     VirtualPathData path = base.GetVirtualPath(requestContext, values);

     if (path != null)
         path.VirtualPath = path.VirtualPath + "/";
     return path;
}

Для краткости я разместил весь пример на CodePaste.net

Теперь все, что вам нужно сделать, это зарегистрировать маршруты с помощью routes.MapRouteTrailingSlash () вместо routes.MapRoute () .

routes.MapRouteTrailingSlash("register",
                             "register",
                             new {controller = "Users", action = "Register"}
);

Маршрут затем добавит косую черту к пути при вызове GetVirtualPath () . Что подойдет RedirectToAction () .

Обновление: Поскольку ссылка CodePaste не работает, вот полный код:

public class TrailingSlashRoute : Route {
    public TrailingSlashRoute(string url, IRouteHandler routeHandler)
        : base(url, routeHandler) {}

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(url, defaults, routeHandler) {}

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                          IRouteHandler routeHandler)
        : base(url, defaults, constraints, routeHandler) {}

    public TrailingSlashRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints,
                          RouteValueDictionary dataTokens, IRouteHandler routeHandler)
        : base(url, defaults, constraints, dataTokens, routeHandler) {}

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) {
        VirtualPathData path = base.GetVirtualPath(requestContext, values);

        if (path != null)
            path.VirtualPath = path.VirtualPath + "/";
        return path;
    }
}

public static class RouteCollectionExtensions {
    public static void MapRouteTrailingSlash(this RouteCollection routes, string name, string url, object defaults) {
        routes.MapRouteTrailingSlash(name, url, defaults, null);
    }

    public static void MapRouteTrailingSlash(this RouteCollection routes, string name, string url, object defaults,
                                         object constraints) {
        if (routes == null)
            throw new ArgumentNullException("routes");

        if (url == null)
            throw new ArgumentNullException("url");

        var route = new TrailingSlashRoute(url, new MvcRouteHandler())
                    {
                        Defaults = new RouteValueDictionary(defaults),
                        Constraints = new RouteValueDictionary(constraints)
                    };

        if (String.IsNullOrEmpty(name))
            routes.Add(route);
        else
            routes.Add(name, route);
    }
}
20
ответ дан 27 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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