从ajax向控制器发布数据后未调用自定义JSON转换器 [英] Custom JSON converter not being called after posting data from ajax to controller

查看:118
本文介绍了从ajax向控制器发布数据后未调用自定义JSON转换器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现了这个自定义json转换器,以根据接收到的数据转换类型,但是似乎从未调用过它.该操作是否在进行本机解析,并且未使用我的转换器?

I have implemented this custom json converter to convert types depending on the data received, but it seems like it's never being called. Is the action doing the native parsing and my converter is not being used?

我的结果已发布到此操作

My results are posted into this action

[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();
    }
}

Ajax

<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#属性:

So the reason I saw this a potential solution is because of this C# attribute:

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

我正在将其作为单个项目或数组转换器读取为列表.因此,使用JavaScript确实很容易.

I'm reading this as a single item or array converter to a list. So this is really easy in JavaScript.

因此,使用文字和instanceof

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

这基本上是说,如果变量不是数组,则将其设为一个.

This basically says, if the variable ain't an array, then make it one.

这样做可能更容易,然后让C#弄乱JSON.

This may be easier to do then to get C# to fiddle around with the JSON.

在我看来,我相信您应该始终在客户端和服务器之间交流最简单的JSON(反之亦然).

Also in my eyes, i believe you should always be communicating the simplest JSON between client and server (and visa versa).

这篇关于从ajax向控制器发布数据后未调用自定义JSON转换器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆