[英]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.