【问题标题】:Own Enum in route param, is it possible?在路由参数中拥有自己的枚举,有可能吗?
【发布时间】:2021-11-15 20:08:43
【问题描述】:

我有一个简单的Api函数:

// POST: api/Cultivation/Sow/1/5
[HttpGet("Sow/{grain}/{id}")]
public IActionResult Sow(Grain grain, int id) { }

我的枚举如下所示:

public enum Grain
{
    None,
    Rice,
    Corn,
    Oats
}

我的问题是,是否可以从 Route 获取 Grain 或任何枚举?是时,怎么做?

如果否,如何在不使用 if 语句等的情况下以优雅的方式通过 int “查找”枚举?因为如果myWebapi不能带enums,那么简单的int就可以轻松搞定

【问题讨论】:

  • 谢谢,它真的很有帮助,但我正在寻找简单的方法来通过属性来做到这一点,因为我正在寻找简单的设置方法。如果无法通过简单的Route 属性获取枚举,我会选择int ;)
  • (Grain)grain 这样的简单演员表

标签: c# asp.net-core enums


【解决方案1】:

请参考此文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.2#use-routing-middleware

希望这会有所帮助。

您可以按照显示的方式添加 url

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

大括号 ({ ... }) 中的标记定义路由参数 如果路由匹配,则绑定。您可以定义多个路线 路由段中的参数,但它们必须用文字分隔 价值。例如,{controller=Home}{action=Index} 不是有效的 路由,因为 {controller} 和之间没有文字值 {行动}。这些路由参数必须有一个名称,并且可能有 指定了其他属性。

【讨论】:

    【解决方案2】:
    public enum EnumReviewStatus
    {
        Overdue = 4,
    }
    
    public IActionResult Index(EnumReviewStatus? statusFilter = null)
    

    url Index?statusFilter=Overdue 有效

    【讨论】:

      【解决方案3】:

      试试这个。

      [HttpGet("Sow/{id}/{grain}")]
      public IActionResult Sow( int id , Grain grain = Grain.none) { }
      

      【讨论】:

      • 注意这一点 - 只有一个使用枚举的操作可以存在。如果您尝试使用不同的枚举执行 2 个或更多操作,它将不起作用并导致 500 错误。
      猜你喜欢
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多