ASP. NET Core 3.1 не может обработать запрос Ax ios, пока не будет добавлен атрибут ApiController - PullRequest
0 голосов
/ 20 января 2020

У меня следующая проблема. Всякий раз, когда я отправляю что-то своей конечной точке Api, ASP. NET Core 3.1 не может обработать запрос. Однако, когда я добавляю атрибут ApiController, он прекрасно работает.

Мой код правильный, но работает только при добавлении этого атрибута. Как это так?

Для справки, вот мой код

API

[ApiController] //Remove this and the code breaks
[Route("api/SomeApi")]
public class ApiController : Controller {

    private readonly IService service;

    public ApiController(IService service)
    {
        this.service = service;
    }

    [HttpPost]
    [Route("Add")]
    public SomeClass Add(SomeClass foo)
    {
        var userId = service.GetCurrentUserId(User);
        foo.Id = Guid.NewGuid();
        foo.UserId = userId;
        service.Add(foo);
        return foo;
    }
}

JS

axios.post('/api/SomeApi/Add', {
   foo: this.foo,

}).then(function (response: any) {
   this.Id = response.Id;
});

К вашему сведению, у меня есть другие методы на моем ApiController с помощью GET / POST. GET работают отлично, но методы POST работают только когда я использую параметры запроса. В этом случае я не использовал параметры запроса, потому что у меня больше данных для отправки в Api, чем на самом деле указано в примере.

Я уже пытался получить свой ответ, используя [FromBody]. Это не работает. Я вместо этого получил ноль. foo даже не был создан.

1 Ответ

1 голос
/ 21 января 2020

Для привязки тела запроса к модели существует два типа: один привязывается от form data, а другой - application/json.

. Для Controller он по умолчанию выбирает данные формы. Для ApiController по умолчанию будут выбраны данные json.

Если вы хотите, чтобы тело запроса на привязку не использовалось [ApiController], вы можете добавить [FromBody]:

//[ApiController] 
[Route("api/SomeApi")]
public class ApiController : Controller
{
    private readonly IService service;
    public ApiController(IService service)
    {
        this.service = service;
    }

    [HttpPost]
    [Route("Add")]
    public SomeClass Add([FromBody]SomeClass foo)
    {
        //do your stuff...
    }
}

Модель:

public class SomeClass 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Вид:

@section Scripts{
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    axios.post('/api/SomeApi/Add', {
        id: 1,
        name: 'sdfsdf'
    })
        .then(function (response) {
            console.log(response);
        })
        .catch(function (error) {
            console.log(error);
        });
</script>
}

Результат: enter image description here

...