ASP .NET-роутинг в JavaScript
В этой короткой статье мы рассмотрим один из способов обработки запросов на JS в ASP .NET.
Если вы занимаетесь веб-разработкой на ASP .NET, вам может в какой-то момент надоесть вновь и вновь указывать URL для отправки запроса при написании очередной формы, отправляющей данные посредством AJAX. Проблему можно решить путём подключения к JavaScript’y роутинга, который, скорее всего, есть у вас на бэкенде.
Выбираем способ реализации
По большему счёту, существуют 2 простых пути реализации поставленной перед нами задачи: • с помощью 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";
На этом всё, надеемся, изложенная информация была полезной!