簡體   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