0

ページのプリレンダリング イベントで実行される Java スクリプト関数があります。

protected void Page_PreRender(object sender, EventArgs e)
{
     var script = "<script>CreateProjectTree('" + serializedSearchCriteria + "');" + "</script>";
     ClientScript.RegisterStartupScript(typeof (string), "createProjectTree", script);
}

上記の Java スクリプト関数に渡される変数は、Page_Loadイベントで入力されるシリアル化された JSON です。

serializedSearchCriteria = JsonConvert.SerializeObject(ProjectSearchCriteria);

これは、シリアル化された後の serializedSearchCriteria の値です。

{"QueryString":null,"ProjectName":"\"24\"","SeasonName":"","MemberName":"","CompanyName":"","CompanyRole":0,"CompanyRoles":"","Year":""}

シリアル化すると、 value の二重引用符が正常にエスケープされることがわかります24

ここでの問題は、デバッグ モードで Java スクリプト関数を見ると、変数 serializedSearchCriteria の値が次のようになっていることです。

{"QueryString":null,"ProjectName":""24"","SeasonName":"","MemberName":"","CompanyName":"","CompanyRole":0,"CompanyRoles":"","Year":""}"

今に気づく24。もう逃げられません。したがって、このオブジェクトは、Java スクリプト関数内に入ると有効な JSON ではなくなります。

なぜこうなった?

オブジェクトはシリアル化されているはずです...ある時点で、シリアル化されていません。誰かが理由を知っていますか?

4

3 に答える 3

1

ブラウザがscript要素を評価するとき、JavaScript も解析し、それらのバックスラッシュを見て消費します。エスケープをエスケープする必要があります。

本当に JSON 文字列を関数に渡したい場合はCreateProjectTree、シリアル化された文字列としてスクリプトに挿入するのではなく、単に再シリアル化するのが最も簡単な方法である場合があります。

var script = "<script>CreateProjectTree(JSON.stringify(" + serializedSearchCriteria + "));" + "</script>";
于 2013-09-06T19:58:56.943 に答える
0

文字列として扱われていると思います。試してください:

var script = "<script>CreateProjectTree(JSON.parse('" + serializedSearchCriteria + "'));" + "</script>";

JSON.parse js 関数が追加されていることに気付くでしょう。

于 2013-09-06T19:58:26.230 に答える
0

JavaScript 文字列リテラルとして解析されたため、\はエスケープ文字です。

JSON テキストを含む JavaScript 文字列リテラルを出力する場合は、その中の特殊文字 (つまり、文字列を区切るために使用している引用符や\s) をエスケープする必要があります。

于 2013-09-06T19:58:05.597 に答える