【问题标题】:Custom JSON converter not being called after posting data from ajax to controller将数据从 ajax 发布到控制器后未调用自定义 JSON 转换器
【发布时间】:2016-11-11 08:40:27
【问题描述】:

我已经实现了这个自定义 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>

【问题讨论】:

  • 这是因为 JSON 可能会为该属性发布一个数组或字符串。如果是这样,在发送之前在 javascript 中执行 if (!(field instanceof Array)) { field = [field] } 可能会更容易!!
  • @CallumLinington 很好的解决方案,谢谢。没有比这更简单的了
  • 回答问题,以便我将其标记为您的解决方案,再次感谢您
  • 一切都为你完成

标签: c# json ajax asp.net-mvc


【解决方案1】:

免责声明:这不是直接答案,而是替代解决方案

所以我看到这是一个潜在的解决方案的原因是因为这个 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(反之亦然)。

【讨论】:

  • 这样更有意义,减少代码行数,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多