使用DTO对象进行Web API路由 - C#

时间:2017-12-26 07:57:32

标签: c# asp.net asp.net-web-api

我有两个项目,一个是SPA,另一个是ASP.NET aspx项目。 通常这两个项目通过Web API相互通信。

有一个像这样的运行方法(从SPA到ASP.NET)

    [HttpPost]
    [Route("DenyInvoice/{approvalId:long}")]
    public IHttpActionResult DenyInvoice(long approvalId)
    {
        string exMsg = "";

        if (DenyInvoice(approvalId, this.UserId, this.Email, out exMsg))
            return Ok();

        return BadRequest(exMsg);
    }

这个方法可以正常工作,但我想编写一个接受DTO变量的方法,如;

    [HttpPost]    
    [Route("InvoiceDetailUpdate/{invoices : invoiceDetailDtoModel}")]
    public IHttpActionResult InvoiceDetailUpdate(invoices : invoiceDetailDtoModel)
    {
        ....
    }

有可能吗?我该怎么做?

你能帮忙吗? 谢谢..

3 个答案:

答案 0 :(得分:0)

您希望通过post检索参数,因此get参数路由不需要。

[HttpPost]    
[Route("InvoiceDetailUpdate")]
public IHttpActionResult InvoiceDetailUpdate(InvoiceDetailDtoModel invoices)
{
    ....
}

另外,请注意类的名称约定。

答案 1 :(得分:0)

使用[FromBody]传递POST参数。有关详细信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api#implement-the-other-crud-operations

[HttpPost]    
[Route("InvoiceDetailUpdate")]
public IHttpActionResult InvoiceDetailUpdate([FromBody]InvoiceDetailDtoModel invoices)
{
    ....
}

答案 2 :(得分:0)

在以下代码中,您可以像这样使用:

  public class BooksController : ApiController
{
    [Route("api/books")]
    public IEnumerable<Book> GetBooks() { ... }

    [Route("api/books/{id:int}")]
    public Book GetBook(int id) { ... }

    [Route("api/books")]
    [HttpPost]
    public HttpResponseMessage CreateBook(Book book) { ... }
}

现在,您可以看到此链接attribute-routing-in-web-api-2 并将您的代码更改为上图

  [Route("api/YourController/InvoiceDetails")]
 public IHttpActionResult InvoiceDetailUpdate(InvoiceDetails invoiceDetailsDto)