2016-07-08 21 views
0

我已經實現了此自定義json轉換器,根據收到的數據轉換類型,但似乎從未被調用過。該操作是否執行本地分析,而我的轉換器沒有被使用?在將數據從ajax發佈到控制器後未調用自定義JSON轉換器

我的結果發佈到這個行動

[HttpPost] 
public JsonResult saveCustomfields(CustomFields customfields) 
{ 

} 

型號

public class Field 
{ 
    public string _label { get; set; } 
    public string _name { get; set; } 
    public string _type { get; set; } 
    public List<Option> option { get; set; } 
} 

public class Fields 
{ 
    [JsonProperty("field")] 
    [JsonConverter(typeof(SingleOrArrayConverter<Field>))] 
    public List<Field> field { get; set; } 
} 

public class Formtemplate 
{ 
    [JsonProperty("fields")] 
    public Fields fields { get; set; } 
} 

public class CustomFields 
{ 
    [JsonProperty("formtemplate")] 
    public Formtemplate formtemplate { get; set; } 
} 

自定義轉換器

public class SingleOrArrayConverter<T> : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(List<T>)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 
     if (token.Type == JTokenType.Array) 
     { 
      return token.ToObject<List<T>>(); 
     } 
     return new List<T> { token.ToObject<T>() }; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

阿賈克斯

<script> 
    jQuery(document).ready(function ($) { 
     var fbTemplate = document.getElementById('fb-template'); 
     var formBuilder = $(fbTemplate).formBuilder(); 

     $(".form-builder-save").click(function (e) { 
      e.preventDefault(); 
      var x2js = new X2JS(); 
      var xml = formBuilder.data('formBuilder').formData; 
      var json = x2js.xml_str2json(xml); 

      alert(JSON.stringify(json)); 

      $.ajax({ 
       url: "saveCustomfields", 
       type: "POST", 
       data: JSON.stringify(json), 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
      }); 
     }); 
    }); 
</script> 
+0

這是因爲JSON可能會發布該屬性的數組或字符串。如果是這樣,那麼在發送它之前,可以更容易在JavaScript中執行if(!(field instanceof Array)){field = [field]}'! –

+0

@CallumLinington優秀的解決方案,謝謝。它不可能比這更簡單 –

+0

回答這個問題,所以我可以將它標記爲您的解決方案,再次感謝您 –

回答

1

免責聲明:這不是一個直接的答案,但替代解決方案

所以我之所以看到這個潛在的解決方案是因爲這個C#屬性:

[JsonConverter(typeof(SingleOrArrayConverter<Field>))] 
public List<Field> field { get; set; } 

我在讀這作爲單個項目或數組轉換器列表。所以這在JavaScript中非常簡單。

所以有使用文字和instanceof

if (!(field instanceof Array)) { // if field isn't an array 
    field = [field]; // make it one 
} 

這基本上說,一個漂亮的小竅門使用JavaScript,如果變量不是數組,然後使它之一。

這樣做可能會更容易,然後讓C#繞過JSON。在我看來,我相信你應該始終在客戶端和服務器之間傳遞最簡單的JSON(反之亦然)。

+0

它更有意義並減少代碼行,謝謝 –

相關問題