0

我的模板从 MvcMusicStore tutroial 修改:

<script type="text/x-kendo-tmpl" id="template">
    <div class="product">
    <a href="@Url.Action("Details", "Store", new {id = ${ProductSubCategoryId} })">
         <img src="@Url.Content("${AlbumArtUrl}")" alt="${Title} image" />
             </a>
        <span><h3>${Title}</h3></span>

        <p>${kendo.toString(Price, "c")}</p>
    </div>
</script>

但 Url.Action 方法有错误:意外符号'$'。

更新1:我不能使用

@Model.First(d => d.ProductCategoryId.Equals(Convert.ToInt32("${ProductSubCategoryId}"))).ProductCategory.Name

但相同的代码

@Url.Content("${AlbumArtUrl}")

工作正常。

4

3 回答 3

1

new {id = ${ProductSubCategoryId} }

这是匿名对象的 C# 代码,而 C# 对 JS 模板一无所知。因此,错误告诉您它不知道 $ 在那里做什么。通常你会从你的 View 模型中传递一些东西,它只在服务器端可用:

new {id = Model.ProductSubCategoryId }

与其使用 URL 助手,不如只使用一个字符串href="Store/Details/${ProductSubCategoryId}"。这可能不是您所需要的,但我对路由和您的模板知之甚少,无法知道这是否是您想要的,或者 ProductSubCategoryId 实际上是您模型的属性。

关于您更新的示例:

Url.Content(之所以有效,是因为该函数在服务器上呈现页面时采用参数,并且在 HTML 中几乎按原样吐出字符串“${AlbumArtUrl}”,并且 HTML 将包含字符串“${AlbumArtUrl }" 以便稍后在客户端解析 JS 模板时,它可以解释该变量。所以在这种情况下,C# 函数.Content(不需要理解那个模板变量,因为对它来说,它只是一个嵌入在 HTML 中的字符串。我建议在 Chrome 中使用 F12 在网络选项卡中查看 GET 响应,这样您就可以看到从操作返回的 HTML 源代码,这样您就可以更好地了解每一步到底发生了什么过程。您将能够看到在您返回的 HTML 中,没有像 Url.Content 这样的 C# 代码,但是您会看到像“${AlbumArtUrl}”这样的 javascript 模板内容,因为这些值不会在服务器端呈现。

另一方面Convert.ToInt32("${ProductSubCategoryId}")失败,因为这个函数期望它被传递的字符串是一个整数,例如Convert.ToInt32("2134"). 就 ToInt32 而言,它说,好的,我看到“某物”是一个字符串,现在我将尝试将该字符串解释为一个数字,这意味着我希望它包含一些数字,例如“456457”但你给了我一堆字母和符号对我来说毫无意义,我无法将其转换为整数。同样,这是在生成页面时在服务器上运行的 C# 函数,并且“${ProductSubCategoryId}”对 C# 没有任何意义,因为它是一个 javascript 模板变量。

于 2013-01-15T23:02:02.447 回答
0

您将服务器端代码与客户端代码混合在一起。这是无效的 C# 代码:

@Url.Content("${AlbumArtUrl}")

您不能使用 helper 以这种方式生成 URL。我建议您在不使用 Url 帮助器的情况下采用正常方式。

于 2013-01-15T22:37:40.780 回答
0

如果你确定要使用 Url.Action,那么这里有一个方法。这是一个黑客,但你可以这样做:

<a href="@Url.Action("Details", "Store")?id=${ProductSubCategoryId}">
于 2013-07-06T15:39:34.063 回答