You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC中如何将jQuery变量传入@Url.Action

问题解决方法

核心问题在于:@Url.Action()是服务器端Razor语法,会在页面渲染时执行;而你传入的ControllerName、ActionResultName是客户端JS变量,服务器渲染时无法读取这些变量的值,直接拼接肯定失败。下面是两种可靠的解决方案:

方案1:利用Razor生成URL模板,客户端替换占位符

这种方法借助Razor生成符合项目路由规则的URL模板,再通过JS替换模板中的占位符为实际参数,能适配自定义路由场景,是最稳妥的方式。

修改后的OpenImageModal函数代码:

function OpenImageModal(ControllerName, ActionResultName, ActionData, IDString, IDLength) {
    var vID = IDString.substring(IDLength);
    if ($.isNumeric(vID)) {
        // 服务器端生成URL模板,占位符用自定义标记
        var urlTemplate = '@Url.Action("{action}", "{controller}")';
        // 替换占位符为实际传入的控制器和动作名
        var targetUrl = urlTemplate.replace("{action}", ActionResultName)
                                   .replace("{controller}", ControllerName);
        
        jQuery.ajax({
            url: targetUrl,
            type: 'POST',
            // 用方括号包裹ActionData,将变量作为请求参数的键名
            data: { [ActionData]: vID },
            success: function (response) {
                if (typeof (response) === 'object') {
                    var vAlt = response.alt;
                    var vLink = response.link;
                    ModalInformation(vAlt, vLink);
                } else {
                    ModalError(response);
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                ModalError(textStatus + " - " + errorThrown);
            }
        })
    }
}

方案2:手动拼接URL(适用于默认路由场景)

如果你的项目使用ASP.NET默认路由规则({controller}/{action}),可以直接通过根路径拼接控制器和动作名:

function OpenImageModal(ControllerName, ActionResultName, ActionData, IDString, IDLength) {
    var vID = IDString.substring(IDLength);
    if ($.isNumeric(vID)) {
        // 用Url.Content获取网站根路径,再拼接控制器和动作名
        var targetUrl = '@Url.Content("~/")' + ControllerName + '/' + ActionResultName;
        
        jQuery.ajax({
            url: targetUrl,
            type: 'POST',
            data: { [ActionData]: vID },
            success: function (response) {
                if (typeof (response) === 'object') {
                    var vAlt = response.alt;
                    var vLink = response.link;
                    ModalInformation(vAlt, vLink);
                } else {
                    ModalError(response);
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                ModalError(textStatus + " - " + errorThrown);
            }
        })
    }
}

额外注意点

  • 你原来的data: { ActionData: vID }写法有问题:这里的ActionData会被当成字面量键名,而不是你传入的参数值(比如"ImageID"),必须用[ActionData]包裹才能将变量作为动态键名。
  • 如果项目使用了区域(Area),需要在模板中额外添加区域参数,比如@Url.Action("{action}", "{controller}", new { area = "{area}" }),再增加对应的参数传入替换。

内容的提问来源于stack exchange,提问作者gchq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:45:10