2

这是我的控制器是什么样子:为什么我的属性路由不起作用?

[Route("api/[controller]")] 
[Produces("application/json")] 
public class ClientsController : Controller 
{ 
    private readonly IDataService _clients; 

    public ClientsController(IDataService dataService) 
    { 
     _clients = dataService; 
    } 

    [HttpPost] 
    public int Post([Bind("GivenName,FamilyName,GenderId,DateOfBirth,Id")] Client model) 
    { 
     // NB Implement. 
     return 0; 
    } 

    [HttpGet("api/Client/Get")] 
    [Produces(typeof(IEnumerable<Client>))] 
    public async Task<IActionResult> Get() 
    { 
     var clients = await _clients.ReadAsync(); 
     return Ok(clients); 
    } 

    [HttpGet("api/Client/Get/{id:int}")] 
    [Produces(typeof(Client))] 
    public async Task<IActionResult> Get(int id) 
    { 
     var client = await _clients.ReadAsync(id); 
     if (client == null) 
     { 
      return NotFound(); 
     } 

     return Ok(client); 
    } 

    [HttpGet("api/Client/Put")] 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    [HttpGet("api/Client/Delete/{id:int}")] 
    public void Delete(int id) 
    { 
    } 
} 

然而,当我请求URL /api/Clients/Get,如下所示:

json = await Client.GetStringAsync("api/Clients/Get"); 

我得到以下异常:

AmbiguousActionException:多个操作匹配。下面 行动匹配的路由数据,并已全部约束满足:

Assessment.Web.Controllers.ClientsController.Index(Assessment.Web) Assessment.Web.Controllers.ClientsController.Details(Assessment.Web) Assessment.Web .Controllers.ClientsController.Create(Assessment.Web)

ClientHttpClient。请注意,尽管使用相同的名称id,但没有GET操作与路线数据匹配。

这里有什么问题?

+0

MVC-5? - 看起来像asp.net-core-mvc –

+0

@StephenMuecke它是核心,我的错误。我经常混淆了MVC 5和6. – ProfK

+0

这是“ClientsController”的整个界面吗?异常消息中的3个操作方法不在代码示例中。如果全部都发布了,我们需要查看其余的路由配置,以确定哪条路由匹配'api/Clients/Get'的请求。 – NightOwl888

回答

0

我认为这是在路由一个错字,它应该在年底,而不是客户端客户小号与(一个或多个)。

[HttpGet("api/Clients/Get")] 

代替

[HttpGet("api/Client/Get")] 

或改变调用端点:您正在使用的属性错误

json = await Client.GetStringAsync("api/Client/Get"); 
2

你有控制器

[Route("api/[controller]")] 

这将映射到api/Clients和前缀在控制器的任何行动路线上的路线。

这样就意味着

[HttpGet("api/Client/Get")] // Matches GET api/Clients/api/Client/Get 
[Produces(typeof(IEnumerable<Client>))] 
public async Task<IActionResult> Get() 
{ 
    var clients = await _clients.ReadAsync(); 
    return Ok(clients); 
} 

匹配,因为控制器上的路由前缀的GET来api/Clients/api/Client/Get

引用Routing to Controller Actions

您需要更新的动作属性的路由相应

[Route("api/[controller]")] 
[Produces("application/json")] 
public class ClientsController : Controller { 
    private readonly IDataService _clients; 

    public ClientsController(IDataService dataService) 
    { 
     _clients = dataService; 
    } 

    [HttpPost] //Matches POST api/Clients 
    public int Post([Bind("GivenName,FamilyName,GenderId,DateOfBirth,Id")] Client model) { 
     // NB Implement. 
     return 0; 
    } 

    [HttpGet("Get")] //Matches GET api/Clients/Get 
    [Produces(typeof(IEnumerable<Client>))] 
    public async Task<IActionResult> Get() { 
     //...code removed for brevity 
    } 

    [HttpGet("Get/{id:int}")] //Matches GET api/Clients/Get/5 
    [Produces(typeof(Client))] 
    public async Task<IActionResult> Get(int id) { 
     //...code removed for brevity 
    } 

    [HttpGet("Put")] //Matches PUT api/Clients/Put 
    public void Put(int id, [FromBody]string value) { 
     //...code removed for brevity 
    } 

    [HttpGet("Delete/{id:int}")] //Matches GET api/Clients/Delete/5 
    public void Delete(int id) { 
    } 
} 

删除动作实际上应该重构为一个HTTP DELETE,应该返回IActionResult

[HttpDelete("Delete/{id:int}")] //Matches DELETE api/Clients/Delete/5 
public IActionResult Delete(int id) { 
    //...code removed for brevity 
} 
相关问题