【问题标题】:Changing Route attribute value dynamically in ASP.NET CORE在 ASP.NET CORE 中动态更改 Route 属性值
【发布时间】:2020-02-03 07:03:19
【问题描述】:

我正在寻找一种在语法上更改 Route 属性值的方法。

我有一个场景,api 路由应该是:

  1. [Route("api/v1/[Controller]")]
  2. [Route("api/xyz/v1/[Controller]")]

基于我是否在调试模式下运行它。

[Route("api/v1/[Controller]")]
[ApiController]  
public class MyController : BaseController
{
}

我尝试在 Base Controller 中添加一个变量,但意识到我无法在 Route 属性中访问它。

【问题讨论】:

  • 只使用控制器上的两个路由属性
  • 编译后不能更改属性的值,但是ConditionalAttribute存在,你可以用它解决一些问题

标签: c# asp.net-mvc asp.net-core .net-core routing


【解决方案1】:

您无法在编译后更改属性的值,因为属性是编译时常量。这也是为什么您不能使用控制器类中的变量作为参数的原因(除非它是const

相反,您可以使用preprocessor directives 这样做

#if DEBUG
[Route("api/v1/[Controller]")]
#else
[Route("api/xyz/v1/[Controller]")]
#endif

(您可能希望将其更改为 if RELEASE 并更改为路线)

【讨论】:

  • 虽然我必须同意它可能有效,但有没有更简洁的解决方案?
  • 最简洁的解决方案是在不同的情况下不需要不同的路线,但一切都是有原因的。一个更简洁的解决方案可能是按照 Kiksen 所说的而不使用属性路由,而是在 Startup.cs 中指定路由
【解决方案2】:

您可以在您的 startup.cs 中执行此操作

app.UseMvc(routes =>
{
   routes.MapRoute("default", "api/{controller=Home}/{action=Index}/{id?}");
});

只需做一个 if 语句进行调试。

app.UseMvc(routes =>
{
   routes.MapRoute("default", "api/xyz/{controller=Home}/{action=Index}/{id?}");
});

或者 UseControllers 或者你正在使用的任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2020-08-18
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多