0

Date 値と整数配列だけでなく、多数の整数プロパティを含む JavaScript オブジェクトがあります。オブジェクトで JSON.stringify(entityModel, null, 2) を呼び出し、結果を HTTP ハンドラーに渡すたびに、次のような結果になります。

{
 "UserId": "12345",
 "Name": "Stewart",
 "PositionId": "2",
 "NextBirthday": "10-11-2013",
 "FavouriteColour": "Blue",
 "Hobbies": "1,3" // this is an array of ints in the client object prior to stringificaiton
}

私が欲しいのは

{
 "UserId": 12345,
 "Name": "Stewart",
 "PositionId": 2,
 "NextBirthday": "10-11-2013",
 "FavouriteColour": "Blue",
 "Hobbies": [1,3]
}

私はJSONを初めて使用しますが、どこが間違っているのか教えてもらえますか? 基本的に、サーバー側では、私のデシリアライザーは Hobbies プロパティを整数配列にデシリアライズしません。JSON によって文字列として扱われる場合、整数に問題が発生する可能性があります。

## 編集

ページが読み込まれると、クライアント オブジェクトは次のようになります。

function EntityModel(){
   this.UserId = null;
   this.Name = null;
   this.PositionId = null;
   this.NextBirthday = null;
   this.FavouriteColour = null;
   this.Hobbies = null;
}

次に値を割り当て、値が数値かどうかを確認し、必要に応じて parseInt を使用して整数値を割り当てます。Hobbies プロパティには、以下のように整数配列を割り当てます。

var checkedValues = new Array();
element.find("input[type=checkbox]:checked").each(function () {
   checkedValues.push(parseInt($(this).val()));
});
return checkedValues;  

したがって、私のオブジェクトは最終的に次のようになります

function EntityModel(){
   this.UserId = 123;
   this.Name = "Stewart";
   this.PositionId = 2;
   this.NextBirthday = '10-11-2013';
   this.FavouriteColour = 'blue';
   this.Hobbies = [1,2];
}

次に、以下のようにオブジェクトをハンドラーに渡します。

var json = JSON.stringify(entityModel, null, 2);
$.ajax({
  url: handlerPath,
  contentType: "application/json; charset=utf-8",
  type: 'POST',
  dataType: "json",
  data: json,
  success: OnComplete,
  error: OnFail
});

最後に、ハンドラー側で JSON 文字列を取得します

using (StreamReader inputStream = new StreamReader(      HttpContext.Current.Request.InputStream ))
{
   jsonString = inputStream.ReadToEnd();
}

そして、それはこのように見えます

"{\n  \"UserId\": \"12345\",\n  \"Name\": \"Stewart\",\n  \"PositionId\": \"2\",\n  \"NextBirthday\": \"2013-11-10\",\n  \"FavouriteColour\": \"Blue\",\n  \"Hobbies\": \"1,2,3\"\n}"
# 編集 2

以下は、クライアント オブジェクトに値を与えるために使用している関数です。最初の関数は、整数配列 (値がチェックボックス リストの選択に基づく場合) または int (値が数値の場合) または文字列のいずれかを返します。

function getElemValue(element, elementType, targetType) {
        switch (elementType) {
            case "System.Web.UI.WebControls.CheckBoxList":
                var checkedValues = new Array();
                element.find("input[type=checkbox]:checked").each(function () {
                    checkedValues.push(parseInt($(this).val()));
                });
                return checkedValues;
            default:
                return TryParseInt(element.val());   
        }
    }

    function TryParseInt(str) {
        var retValue = str;
        if (str != null) {
            if (str.length > 0) {
                if (!isNaN(str)) {
                    retValue = parseInt(str);
                }
            }
        }
        return retValue; 
    }
4

1 に答える 1

0

getElementValueこの機能は、あなたが思っていることをまったく実行していないという印象を受けます。

私が見るいくつかの(潜在的な)問題は次のとおりです。

  • 引数はelementjQuery オブジェクトですか? そうでない場合は、element.val()おそらく例外がスローされます。ブラウザのコンソールにエラーは表示されますか?
  • parseInt2 番目の引数 (基数) なしで使用しています。これは、文字列がゼロ ( ) で始まる場合、 8 進0数として解釈されることを意味します。これを防ぐには、(またはを使用しますが、浮動小数点数も受け入れます)。parseInt(str, 10)Number(str)
  • あなたの関数TryParseIntは不必要に複雑に見えます。を実行するだけで十分なはずでparseInt(str, 10)あり、それが得られた場合はNaN、代わりに元の文字列を返します。

例えば:

function tryParseInt(str) {
    var retValue = parseInt(str, 10);
    return isNaN(retValue) ? str : retValue;
}

そして最後に、ここにあるのはcheckedValues配列にいくつかの値を代入しているだけで、EntityModelオブジェクトには何も代入していません。そのため、最終的な代入はまだ行われていません。私は、まさにそれが間違っている場所であり、すべてが文字列に変換されるという予感があります。

于 2013-02-25T13:08:19.050 に答える