代码之家  ›  专栏  ›  技术社区  ›  Tom Crosman

.Net Core API-传递参数时oData前缀丢失

  •  0
  • Tom Crosman  · 技术社区  · 4 年前

    此调用工作正常,并映射到/oData/Projects。

    [HttpGet(Name = "GetProjects")]
        [EnableQuery]
        public IEnumerable<ProjectEntity> Get()
        {
            return _db.Projects;
        }
    

    如何在不丢失URL中的oData前缀的情况下传递参数?

    这将丢失oData前缀:

    [HttpGet("{id}", Name = "GetProjectById")]
        [EnableQuery]
        public ProjectEntity GetProjectById(int id)
        {
            return _db.Projects.Where(p => p.Id == id).FirstOrDefault();
        }
    

    我正在使用。net核心web api和oData 8.0

    以下是完整的控制器:

    [ApiController]
    [Route("[controller]")]
    public class ProjectsController : ControllerBase
    {       
        private readonly ILogger<ProjectsController> _logger;
        private readonly ApplicationDbContext _db;
    
        public ProjectsController(ILogger<ProjectsController> logger, ApplicationDbContext db)
        {
            _logger = logger;
           _db = db;
        }
    
        [HttpGet("{id}", Name = "GetProjectById")]
        [EnableQuery]
        public ProjectEntity GetProjectById(int id)
        {
            return _db.Projects.Where(p => p.Id == id).FirstOrDefault();
        }
    
        [HttpGet(Name = "GetProjects")]
        [EnableQuery]
        public IEnumerable<ProjectEntity> Get()
        {
            return _db.Projects;
        }
    }
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Md Farid Uddin Kiron    4 年前

    要启用OData属性路由,请在 controller 或 action 应该修饰一个名为 ODataRoutingAttribute . 更名为 ODataAttributeRoutingAttribute in 8.0. 自从你 正在使用 asp.net core 那么你的 controller action 应该 如下所示:

    Model:

    public class ProjectInfo
        {
            public int Id { get; set; }
            public string ApiVersion { get; set; }
            public string Name { get; set; }
            public string PhoneNumber { get; set; }
        }
    

    Controller:

    public class ProjectsController : ControllerBase
        {
            private ProjectInfo[] project= new ProjectInfo[]
            {
                new ProjectInfo
                {
                    Id = 1,
                    ApiVersion = "v1.0",
                    Name = "Kiron",
                    PhoneNumber = "111-222-3333"
                },
                new ProjectInfo
                {
                    Id = 2,
                    ApiVersion = "v1.0",
                    Name = "Farid",
                    PhoneNumber = "456-ABC-8888"
                }
            };
    
            [EnableQuery]
            [HttpGet("odata/Projects")]
            public IActionResult Get()
            {
                return Ok(project);
            }
    
            [ODataAttributeRoutingAttribute]
            [HttpGet("odata/Projects/{key}")]
            public IActionResult Get(int key)
            {
                var project = project.FirstOrDefault(c => c.Id == key);
                if (project == null)
                {
                    return NotFound($"Cannot find project with Id={key}.");
                }
    
                return Ok(project);
            }
        }
    

    Note: 你也可以设置 [ODataAttributeRoutingAttribute] 在全局控制器上,这样就不需要设置每个动作。在里面 那案子你就处理掉吧 [ApiController] 和 [Route("[controller]")]

    Reference Required:

    using Microsoft.AspNetCore.OData.Routing.Attributes;
    

    Startup.cs:

     services.AddControllers().AddOData(opt => opt.Select());
    

    Output:

    enter image description here

    注: 当你使用 oData 8.0 你必须使用 ODataAttributeRoutingAttribute 在你的 控制器 或 行动 正如你可以看到上面的代码和截图。 它会解决你的问题。

    此外,您还可以查看有关我们产品的更多详细信息 official blog document here 这里还有 sample project