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

Наш читатель поделился с нами удобным способом обработки запросов на JavaScript в ASP .NET.


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

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

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

  • через URL вида route/{routename} c последующим редиректом;
  • через реплейсмент-тег вида «[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";

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