1

我正在尝试编写这个接受 POST 请求的控制器。

我需要这个控制器来添加一本新书,并将新书 bookId 添加到另一个名为 StoreList 的对象中。

所以我试图传入新的 bookList,以及需要将 bookId 添加到其中的 storeList。

    // POST: api/BookList
    [HttpPost]
    public async Task<ActionResult<BookList>> PostBookList(BookList bookList, StoreList storeList)
    {
        _context.BookList.Add(bookList);
        await _context.SaveChangesAsync();

        _context.Entry(storeList).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!StoreListExists(storeId))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtAction("GetBookList", new { id = bookList.BookId }, bookList);
    }

这是我的 API 端点:

https://localhost:44362/api/BookList/

这些是我在请求的 BODY 中传递的两个对象(新的 bookList 和现有的 storeList):

{
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
    "bookTitle": "Is this a test 2?"
},
{
    "storeId": "0001f801-6909-4b6e-8652-e1b49745280f",
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7"
}

但是每当我尝试“命中”那个端点时,我都会收到这个错误:

System.InvalidOperationException HResult=0x80131509 Message=Action 'DocumentStorageAPI.Controllers.Book.BookListController.PostBookList (DocumentStorageAPI)' 有多个参数被指定或推断为从请求正文绑定。每个动作只能从正文绑定一个参数。检查以下参数,并使用“FromQueryAttribute”指定从查询绑定,“FromRouteAttribute”指定从路由绑定,“FromBodyAttribute”用于从正文绑定的参数:BookList bookList StoreList storeList

如何让我的控制器允许我添加新 bookList 并更新所需的 storeList?

谢谢!

4

3 回答 3

1

请求的主体应该只有一个对象,PostBookList方法必须只有一个参数(带有[FromBody]属性)。如果您需要在方法中使用这两个类,请创建一个新类,如下所示:

public class PostBookListRequest
{
    public BookList BookList { get; set; }
    public StoreList StoreList { get; set; }
}

PostBookList方法更改为

public async Task<ActionResult<BookList>> PostBookList([FromBody]PostBookListRequest request)
{
    // Your logic here
}

并在请求的 BODY 中执行

{
    "bookList": {
        "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
        "bookTitle": "Is this a test 2?"
    },
    "storeList": {
        "storeId": "0001f801-6909-4b6e-8652-e1b49745280f",
        "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7"
    }
}
于 2019-11-11T18:10:02.823 回答
1

您必须像这样创建一个新模型-

public class AddBookToStoreModel
    {
        public Book BookToAdd { get; set; }
        public StoreList BookStoreList { get; set; }
    }

您必须将其添加到控制器定义中,如下所示 -

[HttpPost]
        public async Task<ActionResult<BookStore>> PostBookList(AddBookToStoreModel model)

您还需要为 Book 和 StoreList 创建单独的模型,如下所示 -

public class Book
    {
        public Guid BookId { get; set; }
        public string BookTitle { get; set; }
    }

public class StoreList
    {
        public Guid StoreId { get; set; }
        public Guid BookId { get; set; }
    }

您发布到控制器的 Json 如下所示 -

{
"BookToAdd": {
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
    "bookTitle": "Is this a test 2?"
},
"BookStoreList": {
    "storeId": "0001f801-6909-4b6e-8652-e1b49745280f",
    "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7"
}
}

我希望这对你有用。

于 2019-11-11T19:26:57.557 回答
1

你可以像这样使用身体:

{
  "bookId": "bc381612-c63b-4438-b35b-161a3a568fc7",
  "title": "Is this a test 2?",
  "storeId" "0001f801-6909-4b6e-8652-e1b49745280f"
}

在 Controller 中,您需要具有这 3 个字段的附加类 BookListBinding,例如,您将使用它来创建 2 个对象。

[HttpPost]
public async Task<ActionResult> PostBookList(BookListBinding binding)
{
    var bookList = new BookList
    {
        Id = binding.BookId,
        Title = binding.Title 
    });

    var storeList = new StoreList
    {
       Id = binding.StoreId,
       BookId = binding.BookId
    }

    // you work with _context

    return CreatedAtAction("GetBookList", new { id = binding.BookId }, bookList);
}

为什么需要更改 StoreList?它是什么?

于 2019-11-11T19:00:19.817 回答