2012-01-07 20 views
4

I jqueryuiダイアログを開くためにjQueryのスクリプトの一部として、次のコード(ID値は、ハードコードされたテスト目的のためのものである)を有する:エスケープ文字

 open: function (event, ui) { 

      $(this).load("@Url.Action("Edit", "Person", 
       new 
       { 
        id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
        selectedPersonFor = Model.SelectedPersonFor, 
        selectedPersonForId = Model.SelectedPersonForId, 
        clientAccountId = Model.ClientAccountId 
       })"); 
     }, 

私の問題点は、ダイアログが開いても、コントローラのアクションが決して当たらないということです。私は私のブラウザでソースを表示する場合は

生成される出力は次のようになります。

open: function (event, ui) { 

      $(this).load("/Person/Edit/28769371-7518-49db-a5ea-b9c62621a609?selectedPersonFor=ClientAccount&selectedPersonForId=2a2dd3b9-a73b-4afa-8237-5a4f37736f8a&clientAccountId=00000000-0000-0000-0000-000000000000"); 
     }, 

私が発見したこと、私は私のスクリプトに上記のURIをハードコーディングし、非エスケープでエスケープアンパサンド(&)を交換する場合アンパサンド(&)私のコントローラのアクションがヒットします。

エスケープされたアンパサンドを取り除くために、スクリプト内のreplaceメソッドの呼び出しを追加しようとしましたが、これは役に立ちません。 を呼び出すために生成された同じページ内の他のURIを見ると、というスクリプト内ではなく、その中にアンパサンドがエスケープされていることに気付きます。

ブラウザからコントローラアクションの呼び出しをスクリプトから処理する方法が、スクリプトの外側からどのように実行されているか、エスケープされたアンパサンドに関連するすべての点で違いがあるようです。

この問題を解決する方法を教えてもらえますか?

さらに情報:私も次のようにロード機能にクエリパラメータを渡して試してみました

:私はこの方法でそれを行う際に

open: function (event, ui) { 

      $(this).load("@Url.Action("Edit", "Person")", 
       { 
        id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
        selectedPersonFor: Model.SelectedPersonFor, 
        selectedPersonForId: Model.SelectedPersonForId, 
        clientAccountId: Model.ClientAccountId 
       }); 
     }, 

は、しかし、私のダイアログはしても開きません。

編集:私は、次の提供のルートを表示するように要求に応じて

(うまくいけば、これは要求されていたものです):

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

私はちょうど私のASPで提供されるデフォルトルートを使用しています.net mvc3 project。

+0

あなたのルートを表示すると簡単に回答できます –

答えて

6

Razorでは@演算子はHTMLエンコード出力=>&になります&になります。

var url = '@Html.Raw(Url.Action("Edit", "Person", new { 
    id = Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
    selectedPersonFor = Model.SelectedPersonFor, 
    selectedPersonForId = Model.SelectedPersonForId, 
    clientAccountId = Model.ClientAccountId 
}))'; 
$(this).load(url); 

今度は、2番目のコードスニペットを考えてみましょう:::あなたがレンダリングされたHTMLを見て

$(this).load("@Url.Action("Edit", "Person")", { 
    id: @Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609"), 
    selectedPersonFor: Model.SelectedPersonFor, 
    selectedPersonForId: Model.SelectedPersonForId, 
    clientAccountId: Model.ClientAccountId 
}); 

場合は、これを見るでしょうあなたはこれが起こることをしたくない場合は、Html.Rawヘルパーを使用することができますModel.SelectedPersonForIdは、おそらくあなたはjavascriptのエラーを取得しているので、javascriptの変数は有効ではありませんので、明らかに動作しません

$(this).load("@Url.Action("Edit", "Person")", { 
    id: 28769371-7518-49db-a5ea-b9c62621a609, 
    selectedPersonFor: Model.SelectedPersonFor, 
    selectedPersonForId: Model.SelectedPersonForId, 
    clientAccountId: Model.ClientAccountId 
}); 

。また、28769371-7518-49db-a5ea-b9c62621a609は引用符で囲まれていないため、有効なJavaScript式ではありません。

あなたは、これはあなたが適切なコンテンツを生成してください仕事をしたい場合は、次の各サーバー側の変数の前にしていないだけのGuidの前で使用

$(this).load("/Person/Edit", { 
    id: '@Guid.Parse("28769371-7518-49db-a5ea-b9c62621a609")', 
    selectedPersonFor: '@Model.SelectedPersonFor', 
    selectedPersonForId: '@Model.SelectedPersonForId', 
    clientAccountId: '@Model.ClientAccountId' 
}); 

お知らせ@演算子。また、値がJavaScript文字列としてラップされていることにも注意してください。

+0

私の2番目のコードスニペットの問題点を指摘してくれてありがとう。私はあなたが提案した変更を加えましたが、私のダイアログには表示されますが、コントローラのアクションはまだヒットしません。 – daveywc

+0

@daveywc、生成されるマークアップは何ですか?コントローラのアクションがヒットしないのはなぜですか? FireBugコンソールには何が表示されますか? AJAXリクエスト中にコントローラに送信されるのは何ですか?サーバーは何を応答しますか? –

+0

生成されたマークアップがある:$(この).LOAD( "/人/編集"、 {ID: '28769371-7518-49db-a5ea-b9c62621a609' selectedPersonFor 'ClientAccount' selectedPersonForId「2a2dd3b9- a73b-4afa-8237-5a4f37736f8a '、 clientAccountId:' 00000000-0000-0000-0000-000000000000 ' }); – daveywc

関連する問題