Здесь я предпочитаю передавать значение в виде заголовка HTTP, а не параметра маршрута, особенно если вы хотите его везде. Это означает, что вам не нужен атрибут Route
и другой URL для каждого приложения. Используя пользовательский ActionFilterAttribute
, есть множество способов передать эту деталь в ваши действия. Например:
public class ApplicationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.HttpContext.Request.Headers.TryGetValue("Application", out var values))
{
// Method 1: This allows you to specify a parameter on your action
context.ActionArguments.Add("application", values.First());
// Method 2: This adds the value into the route data
context.RouteData.Values.Add("Application", values.First());
// Method 3: This will set a property on your controller
if (context.Controller is BaseApplicationController baseController)
{
baseController.Application = values.First();
}
}
base.OnActionExecuting(context);
}
}
И примените его к методам действий или вашему контроллеру:
[Application]
public class FooController : Controller
{
}
Способ 1 Использование:
public IActionResult Index(string application)
{
// do something with the parameter passed in
}
Способ 2 Использование:
public IActionResult Index(string application)
{
var application = (string)RouteData.Values["Application"];
}
Способ 3 Использование:
Сначала создайте базовый контроллер, содержащий свойство:
public abstract class BaseApplicationController : Controller
{
public string Application { get; set; }
}
Затем убедитесь, что ваш контроллер наследует от него:
[Application]
public class FooController : BaseApplicationController
{
}
Теперь вы можете получить доступ к свойству на вашем контроллере:
public IActionResult Index(string application)
{
var application = this.Application;
}
Бонусный метод 4:
Кроме того, вы можете использовать этот метод для использования значения маршрута URL, используя базовый контроллер из метода 3, изменив атрибут так, чтобы он выглядел следующим образом:
public class ApplicationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Controller is BaseApplicationController baseController)
{
baseController.Application = (string)context.RouteData.Values["application"];
}
base.OnActionExecuting(context);
}
}
Добавить атрибут маршрута в ваш контроллер:
[Route("{application}/api/[controller]/[action]")]
А теперь у вас должно быть значение свойства в наборе контроллера.