JQUERY ajax отправляет JSON на контроллер C # MVC, но входящие данные имеют значение null

#c# #jquery #json #ajax #asp.net-mvc

#c# #jquery #json #ajax #asp.net-mvc

Вопрос:

У меня странная проблема. У меня есть структура данных C # с двумя классами:

 public class AddQuestionModel2
{
    public int? QuestionID { get; set; }
    public string QuestionString { get; set; }
    public int? TrueAnswer { get; set; }
    public QuestionType Type { get; set; }
    public IEnumerable<AddQuestionModelAnswer> Answers { get; set; }
}

public class AddQuestionModelAnswer
{
    public int? ID { get; set; }
    public string AnswerString { get; set; }
    public bool? IsRight { get; set; }
    public int? Order { get; set; }
}

public enum QuestionType
{
    SingleSelect,
    MultiSelect,
    OrderAnswers,
    FillingGap,
    ExampleRequired,
    TrueOrFalse
}
  

Javascript генерирует объект javascript (который выглядит нормально для структуры данных), а JSON.stringify преобразуется в следующую строку json:

 {"QuestionString":"<p>Question 1</p>","TrueAnswer":"0","Type":"0","Answers":[{"AnswerString":"<p>Answer 1</p>","IsRight":"0"},{"AnswerString":"<p>Answer 2</p>","IsRight":"0"},{"AnswerString":"<p>Answer 3</p>","IsRight":"0"},{"AnswerString":"<p>Answer 4</p>","IsRight":"0"}]}
  

Данные json отправляются следующей командой jquery:

 $.ajax({
                url: "/Questions/Add",
                method: "POST",
                async: true,
                dataType: "json",
                data: JSON.stringify(data),
                contentType: "application/json; charset=utf-8",
                success: function (e) {
                    if (e.Success) {
                        document.location = "/Questions";
                    }
                },
                error: function (e) {
                    var i;
                    for (i in e) {
                        console.log(e[i]);
                    }
                }
            });
  

На стороне C # у меня есть следующий метод получения данных post:

 [HttpPost]
    public async Task<string> Add([FromBody] AddQuestionModel2 q)
    {
        var ctx = this.HttpContext;
        JsonResultModel res = new JsonResultModel();
    }
  

Параметр «q» всегда равен null. Если я разверну ctx (HttpContext), запрос.Данные формы выбрасываются системой.Исключение InvalidOperationException.

Есть ли какие-либо, если у вас есть какие-либо идеи, что может быть не так? Самая большая проблема заключается в том, что я не могу отладить, что происходит внутри HttpContext и почему он выдает исключение.

Заранее спасибо! Габор

Комментарии:

1. Я добавил определение questionType . Это перечисление, поэтому на стороне клиента оно управляется как число. isRight — это bool в классе, на стороне клиента это 1 или 0.

Ответ №1:

В вашем коде ajax попробуйте data:data вместо data: JSON.stringify(данные). Метод JSON.stringify() преобразует объект или значение JavaScript в строку JSON, но для данных ajax требуется объект JavaScript. Еще один способ попробовать вместо 0 или 1 использовать «true» или «false» в ваших полях bool.

В postman все работает.

Комментарии:

1. Я пробовал с данными: данные. Тот же результат. Также пробовал true / false. Тот же результат.

2. Вы были правы. C # не может преобразовать 0 и 1 в false и true. Мне пришлось использовать чистый javascript true и false. В качестве строки «true» и «false» также не были приняты. Мне также пришлось преобразовать значение Type из string в integer , потому что C # не смог автоматически преобразовать «0» в 0.