2012-01-26 23 views
1

我遇到了一個問題,我嘗試使用Razor在某些javascript中創建一個OData URL。當我運行它時,頁面顯示錯誤。使用剃刀構建一個括號的URL

這裏是例子:

var personId = 123;  
var oDataUrl = "@Url.Content("~/OData/People")(" + personId + ")"; 

預期的結果是:

var oDataUrl = "/OData/People(123)"; 

但剃刀預計調用Url.Content的結果是一個函數。

我使用一個單獨的變量解決了這個問題,但想知道是否有不同的方法。

實例解決方法:

var personId = 123; 
var baseUrl = "@Url.Content("~/OData/People")"; 
var oDataUrl = baseUrl + "(" + personId + ")"; 

的解決方法是可以接受的,但我不知道如果我失去了一些東西。

我已經嘗試使用@:和<文本> < /文本> - 任何人都可以得到這個工作?

回答

1

問題是,就Razor而言,「@ Url.Content(...)(...)」是完全有效的C#表達式。所以它會在「@()」中看到「(」@「Url.Content(...)」後面的「(」),並將其視爲C#表達式的一部分。 parens),這將使得它更難以爲剃刀:)。

例如,如果您具有返回函數求< INT的方法「富」,串>代表,你可能要撥打:

@Foo(123)(456) 

剃刀不能告訴這些案件之間的區別,所以我們提供「@()」逃生艙來將剃刀彎曲到你的意願:)。

這裏有一個固定的例子,應該工作:

var personId = 123;  
var oDataUrl = "@(Url.Content("~/OData/People"))(" + personId + ")"; 

希望幫助!

+0

是的,它的確是我尋找的解決方案!謝謝! –

0

你張貼看起來不正確,因爲它已經轉義雙引號在它的第一個塊:

var oDataUrl = "@Url.Content("~/OData/People")(" + personId + ")"; 

你的意思是這樣:

var oDataUrl = "@Url.Content(\"~/OData/People\")(" + personId + ")\""; 
or 
var oDataUrl = "@Url.Content(\"~/OData/People(" + personId + ")\""; 

+0

該代碼是一個生成JavaScript的Razor模板。它可以被重寫爲var oDataUrl ='@ Url.Content(「〜/ OData/People」)('+ personId +')';它會產生相同的結果。 –