将JSON反序列化为C# - 来自复选框的值

时间:2017-03-31 17:48:05

标签: c# json web-services

我试图通过AJAX将表单值发送到C#Web服务。然后,使用JavaScriptSerializer.Deserialize,将JSON转换为C#类。以下是课程:

[Serializable]
[DataContract(Name = "PostParameters")]
public class TagData
{
    public TagData()
    {
    }

    [DataMember(Name = "TargetId")]
    public string TargetId { get; set; }
    [DataMember(Name = "TargetType")]
    public string TargetType { get; set; }
    [DataMember(Name = "Tags")]
    public List<string> Tags { get; set; }
}

这是被调用的方法:

[WebMethod]
public string UpdateTags(string PostParameters)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    var tagData = serializer.Deserialize<TagData>(PostParameters);
}

当选中多个复选框时,此方法有效。标签属性已成功填充。但是,如果检查的项目少于两个,则存在转换错误。序列化程序无法将单个字符串值转换为List对象。

以下是选中一个复选框后如何发送JSON:     {"Tags":"14","TargetId":"36946","TargetType":"Officer"}

以下是检查了多个复选框的JSON的发送方式:     {"Tags":["12","5","2"],"TargetId":"36946","TargetType":"Officer"}

我尝试将C#类中的Tags属性更改为字符串数组:     public string[] Tags { get; set; } 但是,这导致JSON根本没有映射。

我还尝试将[]添加到复选框输入名称,如下所示:     <input type="checkbox" name="tags[]" />

这样就发送了JSON,并选中了一个复选框:     {"Tags[0]":"14","TargetId":"36946","TargetType":"Officer"}

并选中了多个复选框:{"Tags[0]":"14","Tags[1]":"19","TargetId":"36946","TargetType":"Officer"}

这似乎适用于字符串数组属性,但它不会映射该属性或List属性。 Tags属性将始终为null,因为它无法映射。

更新 - 这里是生成JSON的地方

var params = $.toJSON({ 'PostParameters': JSON.stringify($inputs.serializeObject()) });

这里是serializeObject()函数:

serializeObject: function () {
    var obj = {},
    names = {};

    $.each(this.serializeArray(), function (i, o) {
        var n = o.name,
        v = o.value;

        if (n.includes('[]')) {
            names.n = !names.n ? 1 : names.n + 1;
            var indx = names.n - 1;
            n = n.replace('[]', '[' + indx + ']');
        }

        obj[n] = obj[n] === undefined ? v
          : $.isArray(obj[n]) ? obj[n].concat(v)
          : [obj[n], v];
    });

    return obj;    
}

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

编辑客户端代码,以便在选中一个复选框时发送一​​个元素的数组 检查了一个复选框的JSON:
{"Tags":["14"],"TargetId":"36946","TargetType":"Officer"}

答案 1 :(得分:0)

我能够使用Rick Strahl的例子来解决这个问题:https://weblog.west-wind.com/posts/2010/Sep/07/Using-jQuery-to-POST-Form-Data-to-an-ASPNET-ASMX-AJAX-Web-Service

基本上,创建一个NameValue类:

public class NameValue
{
    public string name { get; set; }
    public string value { get; set; }
}

使用这些扩展方法从集合中获取表单值:

public static class NameValueExtensionMethods
{
    /// <summary>
    /// Retrieves a single form variable from the list of
    /// form variables stored
    /// </summary>
    /// <param name="formVars"></param>
    /// <param name="name">formvar to retrieve</param>
    /// <returns>value or string.Empty if not found</returns>
    public static string Form(this  NameValue[] formVars, string name)
    {
        var matches = formVars.Where(nv => nv.name.ToLower() == name.ToLower()).FirstOrDefault();
        if (matches != null)
            return matches.value;
        return string.Empty;
    }

    /// <summary>
    /// Retrieves multiple selection form variables from the list of 
    /// form variables stored.
    /// </summary>
    /// <param name="formVars"></param>
    /// <param name="name">The name of the form var to retrieve</param>
    /// <returns>values as string[] or null if no match is found</returns>
    public static string[] FormMultiple(this  NameValue[] formVars, string name)
    {
        var matches = formVars.Where(nv => nv.name.ToLower() == name.ToLower()).Select(nv => nv.value).ToArray();
        if (matches.Length == 0)
            return null;
        return matches;
    }
}

仅使用JSON.stringify发布数据:

data: JSON.stringify({ formVars: arForm })

并接受我的Web方法的参数作为NameValue数组:

public string UpdatTags(NameValue[] formVars)

当选中多个复选框,选中一个复选框或未选中复选框时,此方法有效。