Наш читатель поделился с нами удобным способом обработки запросов на 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";
Надеюсь, кому-либо сможет помочь данный очерк. Спасибо за внимание!