Как в ASP.NET Core на странице или контроллере проверить, является ли эта страница или контроллер домашней страницей веб-сайта? Под «домашней страницей» я подразумеваю контроллер или страницу, которую вы получаете, когда вводите только корень веб-сайта, например «www.mysite.com/».
Я знаю, что могу получить RouteData
и использовать его свойство Values
для получения текущей страницы или контроллера, например string? currentPage = RouteData.Values["page"] as string
, а затем проверить, есть ли currentPage == "/Index"
. Однако что, если в соглашениях о пользовательском маршруте для домашней страницы указано другое имя вместо страницы «/Index» по умолчанию или контроллера «/Home»?
Короче говоря, как я могу создать надежный метод, такой как гипотетический метод IsHome()
, который сообщит мне, нахожусь ли я на домашней странице веб-сайта, независимо от того, использую ли я контроллеры MVC или страницы Razor?
Вы можете внедрить HttpContextAccessor и получить доступ к именам «контроллера» и «действия», используя HttpContext.Request.RouteValues
HttpContext.Request.RouteValues
Count = 2
[0]: {[action, Index]}
[1]: {[controller, Home]}
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
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")
}
}
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");
@UnknownCoder, вы можете обновить логику до любого маршрута по умолчанию. Маршрут по умолчанию обычно {controller=Home}/{action=Index}/{id?}
Я не уверен, как мне получить маршрут по умолчанию (имя страницы по умолчанию и имя контроллера по умолчанию). Вот где я борюсь.
@UnknownCoder добавил инструкции, где получить маршрут по умолчанию, и указал другой маршрут по умолчанию/резервный вариант через program.cs.
Спасибо! Однако мне интересно, как я мог получить эти значения по умолчанию программно.
@UnknownCoder, вы можете получить его в своем контроллере через службу конфигурации; stackoverflow.com/a/59399076/5640737
Спасибо! Это действительно очень полезно. Я сделаю это.
Это не будет работать для Razor Pages.
Если вы хотите сделать это надежно на страницах Razor и контроллерах MVC, вы можете проверить метаданные текущего EndPoint
и убедиться, что свойство RoutePattern
RawText
является пустой строкой. Если это так, вы находитесь на домашней странице своего приложения, независимо от того, обслуживается ли оно 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()
предназначен для библиотеки, у меня нет никаких гарантий относительно конфигурации маршрута.
Хотя это должно работать в большинстве сценариев, предполагается, что имя страницы по умолчанию всегда «Индекс», а имя контроллера по умолчанию всегда «Домашняя». Вопрос больше сосредоточен на том, как это учитывать.