就我个人而言,如果您希望在各处使用该值,那么我的首选是将其作为HTTP标头而不是路由参数传递。这意味着您不需要一个Route
属性和每个应用程序的不同URL。使用自定义的ActionFilterAttribute
,有很多方法可以将此详细信息传递到您的操作中。例如:
public class ApplicationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.HttpContext.Request.Headers.TryGetValue("Application", out var values))
{
context.ActionArguments.Add("application", values.First());
context.RouteData.Values.Add("Application", values.First());
if (context.Controller is BaseApplicationController baseController)
{
baseController.Application = values.First();
}
}
base.OnActionExecuting(context);
}
}
然后将其应用于操作方法或您的控制器:
[Application]
public class FooController : Controller
{
}
方法 1 的使用:
public IActionResult Index(string application)
{
}
方法二使用说明:
public IActionResult Index(string application)
{
var application = (string)RouteData.Values["Application"];
}
使用方法三:
首先,创建一个包含以下属性的基础控制器:
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路由值,使用第三种方法中的基本控制器,将属性修改为以下内容:
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]")]
现在您应该已经设置了控制器上的属性值。