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