Строковые данные Json MVC3 (Razor) возвращают значение null (ArgumentNullException)

У меня есть: ПРОСМОТР

<script type="text/javascript">
function postData() {
    var urlact = '@Url.Action("createDoc")';
    var model = '@Html.Raw(Json.Encode(Model))';

    alert(model);

    $.ajax({
        data: stringify(model),
        type: "POST",
        url: urlact,
        datatype: "json",
        contentType: "application/json; charset=utf-8",
        success: function (result) {
            window.location.href = '@Url.Action("CreateWordprocessingDocument","Movies")'
        }
    });
}
</script>

Контроллер

[HttpPost]
        public void createDoc(string mov)
        {
            var movies = new JavaScriptSerializer().Deserialize<IEnumerable<Movie>>(mov);
            //using movies...
        }

Модель

//[Serializable]
public class Movie
{
    //Added Data Annotations for Title & Genre
    public int ID { get; set; }
    [Required(ErrorMessage = "Insert name")]
    public string Title { get; set; }
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }
    [Required(ErrorMessage = "Inserist genre")]
    public string Genre { get; set; }
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
}

Почему, когда я отправляю строковые данные из представления (через функцию публикации Ajax) в контроллер (createDoc), он перестает вызывать исключение ArgumentNullException (кажется, что переданная модель пуста)? Любое обходное решение/решение?

Примечание: без упорядочивания модели все работает, но я пытаюсь упорядочить ее, потому что у меня есть некоторые проблемы с форматом DateTime.

Примечание/2. Я также пытался заменить string mov во входных параметрах действия Controller на IEnumerable Movies, но это тоже не сработало.


person Jack88PD    schedule 11.06.2012    source источник


Ответы (2)


Ваша модель уже закодирована в JSON, поэтому вам не нужно ее Stringify. Это, вероятно, вызывает неверные данные Json, поэтому они не декодируются.

если проблема связана с вашим форматом DateTime, объясните эту проблему, чтобы мы могли помочь ее решить.

person Jaimal Chohan    schedule 11.06.2012
comment
Проблема с форматом DateTime заключается в том, что когда я печатаю из контроллера дату, переданную самому контроллеру, он печатает 01/01/0001 00:00:00 для каждой даты. И я не могу ничего сделать, чтобы изменить/разобрать переданную дату, потому что я получаю ее непосредственно в переменной IEnumerable‹Movie› в действии контроллера. - person Jack88PD; 11.06.2012
comment
Если проблема в десериализаторе JSON, возможно, JSON.NET будет лучше. - person napoleonss; 12.06.2012
comment
Привет, @napoleonss, спасибо за ответ. Я пытался использовать JSON.NET со многими образцами, найденными в Интернете, но не могу понять. Не могли бы вы опубликовать пример кода проблемы и ее решения на json.net? Извините за беспокойство, спасибо. - person Jack88PD; 12.06.2012

Добавление к комментарию ответа @Jaimal о конфигурации JSON.NET. Я использую следующее:

public class JsonNetResult : JsonResult
    {
            public JsonNetResult()
            {
                Formatting = Formatting.None;
            }

            public Encoding ContentEncoding { get; set; }

            public string ContentType { get; set; }

            public object Data { get; set; }

            public JsonSerializerSettings SerializerSettings { get; set; }

            public Formatting Formatting { get; set; }

            public override void ExecuteResult(ControllerContext context)
            {
                if (context == null)
                    throw new ArgumentNullException("context");

                var response = context.HttpContext.Response;
                response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
                if (ContentEncoding != null)
                    response.ContentEncoding = ContentEncoding;

                if (Data == null)
                    return;
                // If you need special handling, you can call another form of SerializeObject below
                var serializedObject = JsonConvert.SerializeObject(Data, Formatting, new JavaScriptDateTimeConverter());

                response.Write(serializedObject);
            }
    }

с участием

public abstract class BaseController : Controller
{

            /// <summary>
            /// Use JSON.NET
            /// </summary>
            protected override JsonResult Json(object data, string contentType, Encoding contentEncoding)
            {
                var result = new JsonNetResult
                                {
                                    Data = data,
                                    ContentType = contentType,
                                    ContentEncoding = contentEncoding,
                                                Formatting = Formatting.Indented
                                };

                return result;
            }

}

а также

public JsonResult Get()
    {
            return Json(myModel, null, null);
    }

Вы можете использовать разные Конвертеры.

person napoleonss    schedule 12.06.2012