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
相关产品推荐
相关产品推荐

