簡體   English   中英

將數據從Ajax發布到控制器后未調用自定義JSON轉換器

[英]Custom JSON converter not being called after posting data from ajax to controller

我已經實現了這個自定義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>

免責聲明:這不是直接答案,而是替代解決方案

因此,我看到此潛在解決方案的原因是由於以下C#屬性:

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

我將其作為單個項目或數組轉換器讀取為列表。 因此,這在JavaScript中確實很容易。

因此,使用文字和instanceof JavaScript有一個不錯的小技巧

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

這基本上就是說,如果變量不是數組,則將其設為一個。

然后,使C#與JSON混在一起可能會更容易做到。

同樣在我眼中,我相信您應該始終在客戶端和服務器之間交流最簡單的JSON(反之亦然)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM