1

我在将动作链接作为 mvc 中的文本时遇到问题。

  function ListProduct() {
            $.get('@Url.Action("ListProduct", "Product")')
                 .done(function (data) {
                     var json = JSON.parse(data.result);
                     $.each(json, function (idx, obj) {
                        $("#tb_product tbody").append(
                        '<tr>' +
                        ' <td>' + obj.CATEGORY_NAME + '</td>' +
                        ' <td><a href="@Url.Action("Detail", "Product", new { id = '+ obj.PRODUCT_ID + ' })">' + obj.PRODUCT_NAME + '</a></td>' +' </tr>');
                        });
                    });
        }

但似乎它不起作用,它too many charaters in character literal'+ obj.PRODUCT_ID + '. 谢谢你看到了。

4

2 回答 2

2

Razor 代码 ( @Url.Action(...)) 运行在服务器端,而 JavaScript 运行在客户端,在服务器已经完成它的工作、返回响应并转移到其他事情之后很久。因此,您无法将 JavaScript 变量传递给 Razor 方法,因为该 JavaScript 变量甚至还不存在。

如果您需要将该值作为实际 URL 路径的一部分包含在内,那么您或许可以手动构建路径。例如:

'<a href="@Url.Action("Detail", "Product")'+ obj.PRODUCT_ID + '">' + obj.PRODUCT_NAME + '</a>'

换句话说,服务器端@Url.Action("Detail", "Product")被评估并返回类似/product/detail/. 然后,在客户端,在您的 JavaScript 中,您所做的只是将产品 id 连接到这个现有字符串上,从而产生类似/product/detail/xxxxxx.

于 2016-03-07T16:52:08.387 回答
0

我认为这只是关于 mvc 生成的内容和 javascript 生成的内容的“级别混淆”。Mvc 不使用字符串连接来构造它的辅助方法调用。在这种情况下,它使用左括号和右括号@Url.Action从周围的文本中解析出方法调用。在中间粘贴字符串连接会使 mvc 代码解析失败。

您得到的错误来自 mvc,因为它尝试处理@Url.Action并失败,因为它不期望在调用它的过程中进行字符串连接。

在我的修复中,看到

@Url.Action("Detail", "Product", new { id = obj.PRODUCT_ID })

是纯c#代码。它纯粹由服务器处理,而不是由 javascript 处理。

我不知道您如何提供此代码,但您不能只提供来自 mvc 项目的 javascript 文件并期望它能够工作。它必须由返回视图的控制器方法提供服务。该视图可以包含此代码。但是,如果您的客户端页面通过脚本 url 引用它并且它只是下载它,即使脚本与所有控制器内容位于同一网站上,mvc 服务器方法也将不起作用。

    $("#tb_product tbody").append(
      "<tr>" +
      " <td><a href='@Url.Action("Detail", "Product", new { id = obj.PRODUCT_ID })'> @obj.PRODUCT_NAME </a></td>" +
      " </tr>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2016-03-07T15:41:03.293 回答