#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.