我正在尝试通过 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);
}
当选中多个复选框时,这有效。已成功填充 Tags 属性。但是,当检查的项目少于两个时,会出现转换错误。序列化程序无法将单个字符串值转换为 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;
}
任何帮助,不胜感激。
编辑客户端代码以在选中一个复选框的情况下发送一个元素的数组
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-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)
当选中多个复选框、选中单个复选框或未选中任何复选框时,这有效。