Pull to refresh

ASP .NET роутинг в JavaScript

Введение


Я студент 2-го курса, в свободное от учебы время пилю для себя небольшой сайтик на ASP .NET. И в какой-то момент, при написании очередной формы, которая отправляет данные при помощи AJAX, я поймал себя на мысли, что мне надоело снова и снова указывать URL для отправки запроса, и было бы неплохо подключить к JavaScript’y роутинг, который есть у меня на back-end’е.


Выбор способа реализации


Немного подумав и спросив на StackOverflow (и не получив ответа), я пришел к выводу, что у меня есть два простых пути реализации этого:


  1. Через URL вида route/{routename} c последующим редиректом
  2. Через реплейсмент-тег вида «[Route:%route_name%]» который при отдаче файла будет заменятся на URL cамого роута.

Первый вариант практически сразу был отброшен как слишком скучный, и я приступил к реализации задуманной функциональности.


Реализация


Немного почитав про то, как ASP .NET обрабатывает реквесты, я решил, что мне следует написать кастомный HttpHandler, который будет по регулярному выражению искать в файлах *.js строку вида «[Route:%route_name%]» и заменять ее на искомый URL.


Итоговый код:


public class JsRoutingHttpHandler : IHttpHandler
{
    public JsRoutingHttpHandler()
    {

    }

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        var phisicalPath = context.Server.MapPath(context.Request.AppRelativeCurrentExecutionFilePath);
        var file = File.ReadAllLines(phisicalPath);
        var routeCatchRegex = new Regex(@"\[Route:([a-zA-Z]+)\]");
        for (int index = 0; index < file.Length; index++)
        {
            var line = file[index];
            var matches = routeCatchRegex.Matches(line);
            foreach (Match match in matches)
            {
                var routeName = match.Groups[1];
                var url = "ERROR[NO ROUTE FOUND]";
                if (Resolver.RouteUrl.ContainsKey(routeName.Value))
                {
                    url = Resolver.RouteUrl[routeName.Value];
                }
                line = line.Replace(match.Value, url);
            }
            context.Response.Output.WriteLine(line);
        }
    }
}

После регистрации этого хэндера в web.config’e все заработало как нужно:


Файл который был запрошен Файл который был получен
var url = "[Route:SaveEntity]"; var url = "admin/entity/save";

Итог


Надеюсь, кому-либо сможет помочь данный очерк. Спасибо за внимание!

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.