NikFaraday
@NikFaraday
Student full-stack Developer

Почему ajax передаёт null?

Нужно передать с разметки данные в контроллер. Вот сам контроллер:

public class MeatController : Controller
    {
        [HttpGet]
        public async Task<IActionResult> Create()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Create([FromBody]CreateViewModel vm)
        {
            if(!ModelState.IsValid)
            {
                return BadRequest(new { responseMessage = "Invalida data" });
            }

            return Ok(new { responseMessage = "Success" });
        }
    }


Вот сам скрипт ajax:

<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script>
$("#submitBtn").on('click', () => {
    let data = {
        name: $("#name").val(),
        description: $("#description").val(),
        price: $("#price").val(),
        weight: $("#weight").val(),
        type: $("#type").val(),
        source: $("#source").val(),
    };

    let jsonData = JSON.stringify(data);

    $.ajax({
        url: '@Url.Action("Create", "Meat")',
        method: 'post',
        data: jsonData,
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: () => {
            alert("Success");
        },
        error: () => {
            alert("Error");
        },
    });
});
</script>


Я пробовал дебагать сам скрипт, но jsonData имеет нормальный и адекватный вид. А вот в экшен модель заходить просто null.

Вот сама модель:
public class CreateViewModel
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public double Price { get; set; }
        public double Weight { get; set; }
        public MeatTypes Type { get; set; }
        public MeatSource Source { get; set; }
    }

    public class CreateValidator : AbstractValidator<CreateViewModel>
    {
        public CreateValidator()
        {
            RuleFor(x => x.Name).Length(3, 15).NotNull().NotEmpty();
            RuleFor(x => x.Description).Length(4, 511).NotEmpty().NotNull();
            RuleFor(x => x.Price);
            RuleFor(x => x.Weight);
            RuleFor(x => x.Type);
            RuleFor(x => x.Source);
        }
    }


UPD: Добавил [IgnoreAntiforgeryToken] к экшену, не помогло

UPD2: Я узнал, что вся проблема в . Точнее, не в его наличии, а если я выбираю его значение и передаю через ajax. Имею в виду, что даже если элемент есть на разметке, но я не беру его значение, тогда всё проходит нормально. Но, если я пытаюсь выбрать из него установленное значение, у меня заходит просто null в экшен
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
NikFaraday
@NikFaraday Автор вопроса
Student full-stack Developer
Разобрался методом "Научного тыка"

UPD: Проблема в том, что модель не может иметь типа enum. Вместо enum лучше поставить int и в сервисах преобразовать в этот тип. Если модель имеет enum и его значение хоть как-то пытается отправиться с фронта, сразу заходит null.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman
C# the best
В запросе десереализуйте объект в строку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы