Как определить, является ли страница или контроллер точкой входа на веб-сайт (домашняя страница)?

Как в ASP.NET Core на странице или контроллере проверить, является ли эта страница или контроллер домашней страницей веб-сайта? Под «домашней страницей» я подразумеваю контроллер или страницу, которую вы получаете, когда вводите только корень веб-сайта, например «www.mysite.com/».

Я знаю, что могу получить RouteData и использовать его свойство Values для получения текущей страницы или контроллера, например string? currentPage = RouteData.Values["page"] as string, а затем проверить, есть ли currentPage == "/Index". Однако что, если в соглашениях о пользовательском маршруте для домашней страницы указано другое имя вместо страницы «/Index» по умолчанию или контроллера «/Home»?

Короче говоря, как я могу создать надежный метод, такой как гипотетический метод IsHome(), который сообщит мне, нахожусь ли я на домашней странице веб-сайта, независимо от того, использую ли я контроллеры MVC или страницы Razor?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете внедрить HttpContextAccessor и получить доступ к именам «контроллера» и «действия», используя HttpContext.Request.RouteValues

HttpContext.Request.RouteValues
Count = 2
    [0]: {[action, Index]}
    [1]: {[controller, Home]}

  1. Добавьте сервис в свой Program.cs
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
  1. Создайте статический класс и метод, который принимает 2 строковых параметра.
public static class HomeHelper
{
   public static bool IsHome(string controller, string action)
   {
      // customize the logic depending on which you want is the home
      return (controller.toLower() == "home" && action.toLower() == "index")
   }
}
  1. Вставьте httpContextAccessor в свой контроллер и используйте статический класс, в примере ниже это домашний контроллер.
public class HomeController : ControllerBase
{
   private readonly IHttpContextAccessor _contextAccessor;

   public HomeController(IHttpContextAccessor contextAccessor)
   {
      _contextAccessor = contextAccessor;
   }

   public IActionResult Index()
   {
      var controllerName = _contextAccessor.HttpContext.Request.RouteValues["controller"];
      var actionName = _context.Accessor.HttpContext.Request.RouteValues["action"];
      
      // this will return true
      var isHome = HomeHelper.IsHome(controllerName, actionName);

      return Content("");
   }
}

Маршрут по умолчанию, в котором указан ваш проект; Project > Properties > launchSettings.json тогда ищи launchUrl


Вы также можете указать другой маршрут по умолчанию или резервный вариант, указав в файле Program.cs; app.MapFallbackToController("Index", "Home");

Хотя это должно работать в большинстве сценариев, предполагается, что имя страницы по умолчанию всегда «Индекс», а имя контроллера по умолчанию всегда «Домашняя». Вопрос больше сосредоточен на том, как это учитывать.

Unknown Coder 20.08.2024 14:48

@UnknownCoder, вы можете обновить логику до любого маршрута по умолчанию. Маршрут по умолчанию обычно {controller=Home}/{action=Index}/{id?}

Jerdine Sabio 20.08.2024 15:19

Я не уверен, как мне получить маршрут по умолчанию (имя страницы по умолчанию и имя контроллера по умолчанию). Вот где я борюсь.

Unknown Coder 20.08.2024 15:25

@UnknownCoder добавил инструкции, где получить маршрут по умолчанию, и указал другой маршрут по умолчанию/резервный вариант через program.cs.

Jerdine Sabio 20.08.2024 15:45

Спасибо! Однако мне интересно, как я мог получить эти значения по умолчанию программно.

Unknown Coder 20.08.2024 16:04

@UnknownCoder, вы можете получить его в своем контроллере через службу конфигурации; stackoverflow.com/a/59399076/5640737

Jerdine Sabio 20.08.2024 16:16

Спасибо! Это действительно очень полезно. Я сделаю это.

Unknown Coder 20.08.2024 16:22

Это не будет работать для Razor Pages.

Mike Brind 20.08.2024 16:29

Если вы хотите сделать это надежно на страницах Razor и контроллерах MVC, вы можете проверить метаданные текущего EndPoint и убедиться, что свойство RoutePatternRawText является пустой строкой. Если это так, вы находитесь на домашней странице своего приложения, независимо от того, обслуживается ли оно Razor Pages или контроллером MVC. Если вы хотите делать это при каждом запросе, вам следует рассмотреть возможность реализации промежуточного программного обеспечения или фильтров, но по сути вы можете получить доступ к конечной точке из HttpContext текущего запроса:

var endpoint = HttpContent.GetEndpoint();
var routeEndPoint = endpoint as RouteEndpoint;
if (string.IsNullOrWhiteSpace(routeEndPoint?.RoutePattern.RawText))
{
    // you are on the home page
}

То, как вы это реализуете (и, следовательно, получаете доступ к HttpContext для текущего запроса), зависит от того, чего именно вы хотите достичь, но это должно дать вам начало.

Это хороший подход, который я тоже рассмотрел. Однако если я захожу на домашнюю страницу, указав имя домашней страницы (например, если я захожу на www.mysite.com/Index), это не работает, поскольку конечные точки для обеих различны, хотя это все равно домашняя страница. Однако конечная точка с пустым необработанным текстом полезна для получения имени страницы по умолчанию, используя ее PageActionDescriptor. Однако я не уверен, что свойство RawText гарантированно будет пустым на странице входа. Поскольку метод IsHome() предназначен для библиотеки, у меня нет никаких гарантий относительно конфигурации маршрута.

Unknown Coder 20.08.2024 17:29

Другие вопросы по теме