如何格式化动作link在mvc中传递参数?

How to format action link pass parameter in mvc?

我在将操作 link 作为 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>');
                        });
                    });
        }

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

我认为这只是"level confusion"关于mvc生成什么和javascript生成什么。 Mvc 不使用字符串连接来构造它的辅助方法调用。在本例中,它使用 @Url.Action 的左括号和右括号从周围的文本中解析出方法调用。在中间粘贴字符串连接会使 mvc 代码解析失败。

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

在我的修复中,看到

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

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

我不知道您如何提供此代码,但您不能只提供来自 mvc 项目的 javascript 文件并期望它能正常工作。它必须从 returns 视图的控制器方法提供。该视图可以包含此代码。但是,如果您的客户端页面通过脚本 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>

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") 被评估为 returns 类似 /product/detail/ 的东西。然后,在客户端,在你的 JavaScript 中,你所做的只是将产品 ID 连接到这个现有的字符串上,从而产生类似 /product/detail/xxxxxx.

的结果