0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: javascript, csharp, js, asp .net, обработка запросов</p>
1
<p>Теги: javascript, csharp, js, asp .net, обработка запросов</p>
2
<p>В этой короткой статье мы рассмотрим один из способов обработки запросов на JS в ASP .NET.</p>
2
<p>В этой короткой статье мы рассмотрим один из способов обработки запросов на JS в ASP .NET.</p>
3
<p>Если вы занимаетесь веб-разработкой на ASP .NET, вам может в какой-то момент надоесть вновь и вновь указывать URL для отправки запроса при написании очередной формы, отправляющей данные посредством AJAX. Проблему можно решить путём подключения к JavaScript’y роутинга, который, скорее всего, есть у вас на бэкенде.</p>
3
<p>Если вы занимаетесь веб-разработкой на ASP .NET, вам может в какой-то момент надоесть вновь и вновь указывать URL для отправки запроса при написании очередной формы, отправляющей данные посредством AJAX. Проблему можно решить путём подключения к JavaScript’y роутинга, который, скорее всего, есть у вас на бэкенде.</p>
4
<h2>Выбираем способ реализации</h2>
4
<h2>Выбираем способ реализации</h2>
5
<p>По большему счёту, существуют 2 простых пути реализации поставленной перед нами задачи: • с помощью URL вида route/{routename} c последующим редиректом; • с помощью реплейсмент-тега вида "[Route:%route_name%]" (при отдаче файла он будет меняться на URL cамого роута).</p>
5
<p>По большему счёту, существуют 2 простых пути реализации поставленной перед нами задачи: • с помощью URL вида route/{routename} c последующим редиректом; • с помощью реплейсмент-тега вида "[Route:%route_name%]" (при отдаче файла он будет меняться на URL cамого роута).</p>
6
<p>Давайте рассмотрим, как реализовать второй вариант.</p>
6
<p>Давайте рассмотрим, как реализовать второй вариант.</p>
7
<h2>Реализация выбранной функциональности</h2>
7
<h2>Реализация выбранной функциональности</h2>
8
<p>Учитывая, каким образом ASP .NET обрабатывает реквесты, становится понятным, что надо написать кастомный HttpHandler, который станет по регулярному выражению искать в *.js-файлах строку вида "[Route:%route_name%]" с последующей заменой её на искомый URL. В результате мы получим следующий код:</p>
8
<p>Учитывая, каким образом ASP .NET обрабатывает реквесты, становится понятным, что надо написать кастомный HttpHandler, который станет по регулярному выражению искать в *.js-файлах строку вида "[Route:%route_name%]" с последующей заменой её на искомый URL. В результате мы получим следующий код:</p>
9
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); } } }<p>После регистрации данного хэндлера в web.config’e, видим, что всё заработало.</p>
9
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); } } }<p>После регистрации данного хэндлера в web.config’e, видим, что всё заработало.</p>
10
<p>Запрошенный файл:</p>
10
<p>Запрошенный файл:</p>
11
var url = "[Route:SaveEntity]";<p>Полученный файл:</p>
11
var url = "[Route:SaveEntity]";<p>Полученный файл:</p>
12
var url = "admin/entity/save";<p>На этом всё, надеемся, изложенная информация была полезной!</p>
12
var url = "admin/entity/save";<p>На этом всё, надеемся, изложенная информация была полезной!</p>
13
<p><a>Источник</a></p>
13
<p><a>Источник</a></p>
14
14