Как получить URL текущей страницы в ASP.NET C#?
Основные способы получения URL текущей страницы в ASP.NET
Проблема, с которой вы столкнулись, очень типична для начинающих. Дело в том, что в разных технологиях ASP.NET (Web Forms, MVC, Razor Pages, Core) способы доступа к URL немного отличаются. Давайте разберём универсальные и правильные подходы.
1. ASP.NET Web Forms (традиционный)
В Web Forms у вас есть доступ к объекту Request через свойство страницы Page или напрямую, если вы находитесь в коде страницы (code-behind).
// Полный URL (схема + хост + путь + query)
string fullUrl = Request.Url.AbsoluteUri;
// Результат: "https://example.com/page.aspx?id=123"
// Только путь (без query)
string path = Request.Url.AbsolutePath;
// Результат: "/page.aspx"
// Query-строка (без знака вопроса)
string query = Request.Url.Query;
// Результат: "?id=123"
// Только имя хоста
string host = Request.Url.Host;
// Результат: "example.com"
Важно: Не используйте HttpContext.Current в Web Forms без проверки на null. Лучше обращаться к this.Request внутри класса страницы.
2. ASP.NET MVC / Razor Pages (старый .NET Framework)
В контроллерах MVC и PageModel Razor Pages доступ к Request аналогичен:
// В контроллере MVC
public ActionResult Index()
{
string currentUrl = Request.Url.AbsoluteUri;
return View();
}
// В PageModel Razor Pages
public class IndexModel : PageModel
{
public void OnGet()
{
string url = Request.Url.AbsoluteUri;
}
}
3. ASP.NET Core (современный подход)
В ASP.NET Core API изменился. Здесь нет свойства Request.Url. Вместо него используется HttpRequest с конструктором URI:
// Полный URL
string fullUrl = $"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}";
// Или более элегантно через вспомогательный метод
var uri = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
string absoluteUrl = uri.AbsoluteUri;
// Только путь
string path = Request.Path;
// Query-строка
string query = Request.QueryString.Value;
Рекомендация для Core: Создайте extension-метод для удобства:
public static class HttpRequestExtensions
{
public static Uri GetAbsoluteUri(this HttpRequest request)
{
return new Uri($"{request.Scheme}://{request.Host}{request.Path}{request.QueryString}");
}
}
// Использование:
string url = Request.GetAbsoluteUri().AbsoluteUri;
Почему ваш код не работал?
- Request.Url.ToString() — работает, но возвращает URL с портом (например, :5000). Если вам нужно без порта, используйте
Request.Url.GetLeftPart(UriPartial.Authority). - HttpContext.Current.Request.Url.AbsoluteUri — может быть null, если код выполняется не в контексте HTTP-запроса (например, в фоновой задаче или при старте приложения). Всегда проверяйте
HttpContext.Current != null. - Page.Request — ошибка возникает, потому что
Page— это класс, а не свойство. В Web Forms нужно использоватьthis.Page.Requestили простоRequest.
Универсальный совет
Если вы пишете библиотеку или код, который должен работать в разных версиях ASP.NET, используйте интерфейс IHttpContextAccessor (для Core) или проверяйте HttpContext.Current (для Framework). Но в рамках одного проекта лучше придерживаться специфичного для технологии подхода.
Альтернативный подход: получение URL через JavaScript и передача на сервер
Иногда проще получить URL на клиенте и передать его на сервер, особенно если вам нужен точный адрес, который видит пользователь (включая хэш-часть #, которая не передаётся на сервер).
// JavaScript (например, в Razor View)
<script>
var currentUrl = window.location.href;
// Отправляем на сервер через скрытое поле или AJAX
document.getElementById('hiddenUrl').value = currentUrl;
</script>
// На сервере (C#)
string clientUrl = Request.Form["hiddenUrl"];
Этот метод полезен, когда:
- Вам нужно получить URL после редиректов на клиенте.
- Сайт использует SPA (Single Page Application) с изменением хэша.
- Вы хотите избежать проблем с прокси-серверами или балансировщиками нагрузки, которые могут искажать URL.
Однако помните: этот способ требует, чтобы JavaScript был включён у пользователя, и добавляет лишний сетевой запрос. Для большинства серверных задач лучше использовать методы из первого ответа.