如何在@URL.Action()中访问JavaScript变量

79

我怎样才能在@URL.Action()中访问JavaScript值?就像这样:

<script type="text/javascript">
function name(myjavascriptID)
{
     jQuery("#list_d").jqGrid('setGridParam', { url: '@URL.Action("download file", "download", new { id = <myjavascriptID> })', page: 1 });

}
</script>
6个回答

151

你无法实现该需求。当生成动作URL时,JavaScript不会执行。你可以采取以下方式:

function name(myjavascriptID)    {
     var link = '@Url.Action("download file", "download", new { id = "-1" })';
     link = link.replace("-1", myjavascriptID);

     jQuery("#list_d").jqGrid('setGridParam', { url: link, page: 1 });
}

如果id是字符串,比如“Hello world”会怎么样? - Nic
这个想法是让-1成为字符串中独一无二的可识别标志,你可以用任何你想要的东西来替换它。你需要确保“Hello World”被编码,例如使用“Hello+World”。但是,确实可以用任何你想要的东西来替换它。 - Brian Mains
2
没有更简洁的解决方案吗? - juFo
很好的答案。现在我不必担心路由配置的更改了。我使用“{id}”字符串代替“-1”,这样看起来更自然,而且我不必担心将来在任何其他变量中使用-1值,但不幸的是,在替换函数中它必须通过Url.Encode进行转换,并且这些字符串的大小写有所不同。 - alcohol is evil
1
@URL.Action 前缀的大写 URL 改为 @Url.Action,因为它会导致编译时错误。 - Shaiju T
显示剩余3条评论

20

我做了一个相似的事情,但不那么冗长:

var myUrl = '@Url.Action("Solution","Partner")/' + myjavascriptID;
$.ajax.load(myUrl); // or whatever

由于路由机制,我们可以做到这一点,而最终使用路由字典参数的Url.Action会将其转换为类似于以下的URI:

我们之所以能够实现这一点,是因为使用了路由,而通过路由字典参数进行的Url.Action最终被翻译成一个看起来像这样的URI:

http://localhost:41215/Partner/Solution?myJavascriptID=7

我只是个次要选择,就像一位智慧的老人曾经说过:"哈利,我们所做的选择才是真正展现我们本质的,比我们的能力更为重要。"


它将会破坏RoutAttribute配置 :((( - Kate

13

您可以像下面显示的那样将变量传递到任何链接中...

var url = '@Html.Raw(@Url.Action("MethodName", "ControllerName"))' + '?id = ' + myjavascriptID

2
与Brian Mains的回答类似,您可以格式化URL字符串而不是将-1替换为变量,如果像我一样,您认为这样更易读。以下答案假定您已按建议修改了String的原型,如此答案所示:
var url = unescape('@Url.Action("download file", "download", new { id = "{0}" })').format(myjavascriptID);
unescape 函数的调用是必要的,如果你想对你的 {0} 进行解码。我喜欢这种替代方案,因为它使得从JS变量中获取多个参数更加容易。例如:
var url = unescape('@Html.Raw(Url.Action("Action", "Controller", new { id = "{0}", name = "{1}" }))').format(myID, myName);

我在第二个示例中添加了Html.Raw,以避免在url字符串中出现&amp


将您的答案添加到此答案中,就可以得到完美的答案:https://dev59.com/OYLba4cB1Zd3GeqPdFjr#36981170 - David Létourneau

1
您可以像下面的代码一样替换网址。
var jsUrl = '@Url.Action("action", "controller")'; // ## is the token
var getUrl = jsUrl.replace('action', action).replace('controller', controller)  
$("#RenderPartial").load(getUrl); 

0

你可以用以下方法在C#中构建JavaScript代码:

function fun(jsId) {
  var aTag = '<a href="@Html.Raw(@Url.Action("ActionName", "ControllerName", new { objectId = "xxx01xxx" }).Replace("xxx01xxx", "' + jsId + '"))">LINK</a>';
}

以下是使用此技术重写的问题代码:

function name(myjavascriptID) {
  jQuery("#list_d").jqGrid('setGridParam', { url: '@Html.Raw(@URL.Action("download file", "download", new { id = "XXXmyjavascriptIDXXX" }).Replace("XXXmyjavascriptIDXXX", "' + myjavascriptID + '"))', page: 1 });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接