2017-03-31 4 views
0

フォーム値をAJAX経由でC#Webサービスに送信しようとしています。 JavaScriptSerializer.Deserializeを使用して、JSONをC#クラスに変換します。以下は、クラスである:JSONをC#にデシリアライズする - チェックボックスの値

[WebMethod] 
public string UpdateTags(string PostParameters) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    var tagData = serializer.Deserialize<TagData>(PostParameters); 
} 

つ以上のチェックボックスがチェックされている場合は、この作品:

[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; } 
} 

ここで呼び出されるメソッドです。 Tagsプロパティは正常に読み込まれます。ただし、チェックされる項目が2つ未満の場合は、変換エラーが発生します。シリアライザは、単一の文字列値をListオブジェクトに変換することはできません。ここで

JSONを1つのチェックボックスにチェックして送信する方法である:私は私の中でタグのプロパティを変更しようとし {"Tags":["12","5","2"],"TargetId":"36946","TargetType":"Officer"}

:ここ {"Tags":"14","TargetId":"36946","TargetType":"Officer"}

はJSONが複数のチェックボックスにチェックして送信する方法でありますC#クラスを文字列配列に置き換えます: public string[] Tags { get; set; } しかし、JSONはまったくマップされませんでした。

私はまた、[]そうのようなチェックボックスの入力名に追加しようとしました: {"Tags[0]":"14","TargetId":"36946","TargetType":"Officer"}

と確認され、複数のチェックボックス: <input type="checkbox" name="tags[]" />

これは、1つのチェックボックスにチェックして、ほど渡ってJSONを送りました。 {"Tags[0]":"14","Tags[1]":"19","TargetId":"36946","TargetType":"Officer"}

これは、文字列配列プロパティで動作するようですが、そのプロパティまたはListプロパティのいずれにもマッピングされません。 Tagsプロパティはマップできないため、常にnullになります。

UPDATEが - ここで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;  
} 

すべてのヘルプは高く評価されています。 1つのチェックボックスの場合には一つの要素の配列を送信するために

+0

それは '{" Tags [0] ":[" 14 "]でなければなりません。 – shakib

+0

Jsonが送信される前にクライアント側でJsonが生成される場所を投稿できますか? – Taki

+0

投稿をJSONの生成方法で更新しました – getoutofmylaboratory

答えて

0

私はここリックシュトラールの例を使用してこの問題を解決することができました。 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; } 
} 

は、これらの拡張機能mを使用しますコレクションからフォームの値を取得する方法:

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を使用してデータをポストします。唯一の文字列化:

data: JSON.stringify({ formVars: arForm })

とのNameValue配列として私のWebメソッドにパラメータを受け入れる:

public string UpdatTags(NameValue[] formVars)

これは、複数のチェックボックスがチェックされている場合、単一のチェックボックスがチェックされている作品、あるいは全くチェックボックスがチェックされます。

0

編集あなたのクライアント側のコードは、一つのチェックボックスにチェックして
JSONを選択する:
{"Tags":["14"],"TargetId":"36946","TargetType":"Officer"}

+0

できましたが、それでもC#クラスリストタグまたはstring [] Tagsプロパティにはマップされません。 JSONは次のようになりました。{{"Tags [0]": "[23]"、 "Tags [1]": "[19]"、 "TargetId": "36946"、 "TargetType": "Officer"} ' – getoutofmylaboratory

関連する問題