我试图通过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;
}
感谢任何帮助。
答案 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)
当选中多个复选框,选中一个复选框或未选中复选框时,此方法有效。