2012-01-07 28 views
4

我有下面的代碼作爲一個jQuery腳本打開一個jQueryUI的對話的一部分(id的值是硬編碼用於測試目的):轉義字符通過調用生成URL.Action與jQuery腳本

 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以上到我的腳本,並用非轉義替換轉義號(&) &符號(&),然後我的控制器操作被擊中。

我已經嘗試在我的腳本中添加對替換方法的調用以擺脫轉義符號,但這沒有幫助。當我查看同一頁面中的其他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項目。

+0

如果你顯示你的路線,它會更容易回答 – 2012-01-07 08:23:51

回答

6

在剃刀@運算符用於HTML編碼輸出=>&變成&。如果你不希望這樣的事情發生,你可以使用Html.Raw幫手:

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); 

現在讓我們考慮你的第二個代碼片段:

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

如果你看一下渲染HTML,你會看到:

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

這顯然是行不通的,因爲Model.SelectedPersonForId可能不是一個有效的JavaScript變量,這樣你得到一個JavaScript錯誤。另外28769371-7518-49db-a5ea-b9c62621a609不是一個有效的JavaScript表達式,因爲您沒有用引號包裝。

如果你想這個工作確保你生成正確的內容:

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

通知的@運營商每個服務器端變量之前使用,不僅在GUID的前面。另外請注意,這些值被封裝爲javascript字符串。

+0

感謝您花時間指出我的第二個代碼片段的問題。我已經做出了您所建議的更改,現在我的對話框會顯示,但我的控制器操作仍未打中。 – daveywc 2012-01-07 09:23:29

+0

@daveywc,生成的標記是什麼?你的控制器操作爲什麼沒有命中?在FireBug控制檯中看到什麼?在AJAX請求期間發送給控制器的是什麼?服務器迴應什麼? – 2012-01-07 09:24:40

+0

生成的標記爲:$(本).load( 「/人/編輯」, { ID: '28769371-7518-49db-a5ea-b9c62621a609', selectedPersonFor: 'ClientAccount', selectedPersonForId:「2a2dd3b9- a73b-4afa-8237-5a4f37736f8a', clientAccountId:'00000000-0000-0000-0000-000000000000' }); – daveywc 2012-01-07 09:45:51