繁体   English   中英

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

[英]Deserialize JSON to C# - Values from Checkboxes

我正在尝试通过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; } public string[] Tags { get; set; } 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;    
}

任何帮助表示赞赏。

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

我可以在这里使用Rick Strahl的示例来解决此问题: https : //weblog.west-wind.com/posts/2010/Sep/07/Using-jQuery-to-POST-Form-Data-to-an-ASPNET- ASMX的AJAX的Web服务

本质上,创建一个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 })

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

public string UpdatTags(NameValue[] formVars)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM