1

この json 文字列を ac# オブジェクトに逆シリアル化する際に問題が発生しています。モデルのさまざまな構成を試してみましたが、コードをシリアル化し、mvc 値プロバイダーにこれを実行させようとしましたが、動作させることができません.....だから、この JSON 文字列を自分のコントローラーを作成し、それをオブジェクトに入れ、正しいオブジェクトを作成してデータベースにスローします。

[ArgumentNullException: Value cannot be null.
Parameter name: value]
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) +162
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, JsonSerializerSettings settings) +66
   InSight.Controllers.QuestionController.CreateSimpleQuestion(String json) +25

これは、コントローラーに送信する前の文字列です。

var data = JSON.stringify({
            QuestionTitle: title,
            Keywords: key,
            Description: desc,
            Comments: comments,
            QuestionType: type,
            choices: {
                DisplayText: text,
                OrderNumber: order,
                is_correct:is_correct
            }
        });

これはコントローラーメソッドです:

public ActionResult CreateSimpleQuestion(string json)
    {
        SimpleQuestion temp = JsonConvert.DeserializeObject<SimpleQuestion>(json);
        Question question = new Question();
        question.QuestionTitle = temp.QuestionTitle;
        question.QuestionType = temp.QuestionType;
        question.Keywords = temp.Keywords;
        question.is_counted = true;
        question.DateCreated = DateTime.Now;
        question.Comments = temp.Comments;
        question.QuestionType = "Simple";
        db.Questions.Add(question);

        db.QuestionChoices.Add(temp.choices.First());
        db.SaveChanges();
        return RedirectToAction("Index");
    }

これがモデルです:

public class SimpleQuestion
    {
            public int QuestionId { get; set; }

            public string QuestionTitle { get; set; }

            public DateTime DateCreated { get; set; }

            public string QuestionType { get; set; }

            public string Keywords { get; set; }

            public bool is_counted { get; set; }

            public string Description { get; set; }

            public string Comments { get; set; }

        public List<QuestionChoices> choices { get; set; }
    }

最後に、これは渡される実際のデータ文字列です。

{"QuestionTitle":"This is the Question Title",
"Keywords":"Blue pony, sharks",
"Description":"This is the description field.",
"Comments":"No comment has been left.",
"choices":{
    "DisplayText":"Will it rain tomorrow?",
    "OrderNumber":"1","is_correct":false
  }
} 

解決策data定義されて いる JS を次のように変更します。

            var data = {
            "QuestionTitle": title,
            "Keywords": key,
            "Description": desc,
            "Comments": comments,
            "QuestionType": type,
            "choices": {
                "DisplayText": text,
                "OrderNumber": order,
                "is_correct":false
            }
        };
4

2 に答える 2

3

あなたの問題は、JSONに関してはよくあることですが、JSONとデータ構造の不一致です。

あなたのデータ構造には、これがあります: QuestionChoices のリスト。

public List<QuestionChoices> choices { get; set; }

JSON でこれを送信します:単一のオブジェクト。

        choices: {
            DisplayText: text,
            OrderNumber: order,
            is_correct:is_correct
        }

JSON では配列 (またはリスト) は[]で記述されることに注意してください。したがって、正しい JSON は次のようになります。

        choices: [{
            DisplayText: text,
            OrderNumber: order,
            is_correct:is_correct
        }]

複数の選択肢は、[] 内でコンマで区切られます。

choicesこの問題は、単一のオブジェクトを含む配列ではなく、単一のオブジェクトであると定義する JavaScript コードで既に発生しています。それを修正すると、問題は解消されます。

于 2013-10-31T21:12:21.430 に答える
3

問題の真の解決策は、MVC のモデル バインディング機能を使用することです。メソッド パラメーターの型をクラスに変更すると、MVC は JSON 値をそれにバインドします。

public ActionResult Create(SimpleQuestion model)
{
  // use model now
  // TO DO :Save and redirect
}

ajax 呼び出しでcontentTypeプロパティ値を " application/json " として指定していることを確認してください。

また、有効な JSOn の場合は stringify を呼び出す必要はありません。以下のコードは正常に動作します

$(function () {
    var data = {
        "QuestionTitle": "This is the Question Title",
        "Keywords": "Blue pony, sharks",
        "Description": "This is the description field.",
        "Comments": "No comment has been left.",
        "choices": {
            "DisplayText": "Will it rain tomorrow?",
            "OrderNumber": "1",
            "is_correct": false
        }
    };      
    $.post("@Url.Action("Create","Home")", data, null, 'application/json');

});

ここに画像の説明を入力

于 2013-10-31T20:50:53.723 に答える