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