使用Razor构建带括号的URL

时间:2012-01-26 20:44:14

标签: razor

我遇到了一个问题,我试图在一些使用Razor的javascript中创建一个OData URL。运行时页面显示错误。

以下是示例:

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

预期结果是:

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

但Razor希望调用Url.Content的结果是一个函数。

我使用一个单独的变量解决了这个问题,但想知道是否有不同的方式。

示例解决方法:

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

解决方法是可以接受的,但我不知道我是否遗漏了某些东西。

我已尝试使用@:和< text>< / text> - 任何可以使这个工作的人?

2 个答案:

答案 0 :(得分:2)

问题是,就Razor而言,“@ Url.Content(...)(...)”是一个完全有效的C#表达式。所以它看到“(@”在“@ Url.Content(...)之后”并将其视为C#表达式的一部分。你应该在“@()”中包装“Url.Content()”调用(注意额外的parens),这会让Razor更加困惑:)。

例如,如果你有一个方法“Foo”,它返回一个Func< int,string>代表,你可能想打电话:

@Foo(123)(456)

Razor无法区分这些情况,所以我们提供了“@()”逃生舱,以便根据您的意愿弯曲Razor。)。

这是一个应该有效的固定示例:

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

希望有所帮助!

答案 1 :(得分:0)

您发布的第一个块看起来不正确,因为它中没有未加引号的双引号:

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

你的意思是:

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