2012-06-11 45 views
0

我有: VIEWMVC3(剃鬚刀)的Json字符串化數據返回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; } 
} 

爲什麼當我從View(通過Ajax post函數)將字符串化數據發佈到Controller(createDoc)時,它會停止拋出ArgumentNullException(看起來模型傳遞爲空)? 任何解決方法/解決方案?

注意:如果沒有對模型進行字符串化處理,但是我試圖將其字符串化,導致另一種方式導致DateTime格式出現問題。

注/ 2:我也試着更換與IEnumerable的電影控制器動作的輸入參數串MOV,但它也不能工作。

回答

0

你的模型已經是JSON編碼,因此你不需要對它進行串聯化。這可能會導致無效的Json數據,因此它不被解碼。

如果您的DateTime格式是問題,那麼請解釋該問題,以便我們幫助解決該問題。

+0

與DateTime格式的問題是,當我從控制打印傳遞給控制器​​的日期iteself,它打印* 01/01/0001 00:00:00 *每個日期。我無法做任何修改/解析傳遞的Date的原因,因爲我直接在控制器操作的IEnumerable 變量中收到它。 – Jack88PD

+0

如果問題出在JSON解串器上,可能JSON.NET會更好。 – napoleonss

+0

嗨,@napoleonss謝謝你的回答。我試着使用JSON.NET與建立在網絡上的許多樣品,但我不能想通了。你能否在json.net上發佈一個示例代碼來解決問題及其解決方案?對不起,打擾你了,謝謝。 – Jack88PD

0

添加到評論@ 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); 
    } 

您可以使用不同的Converters