我在MVC视图中有一个看起来像这样的Javascript语句并且有效:
win.attachURL('<%: Url.Action("GraphDetails", "Dashboard", new { area = "Anglian", OSName = "Hello" }) %>');
当我尝试提取变量'Hello'并将其放入javascript变量(id)并随后将其嵌入我的标记中时,它会中断:
var id = "Hello";
win.attachURL('<%: Url.Action("GraphDetails", "Dashboard", new { area = "Anglian", OSName = "' + id + '" }) %>');
问题是,我如何在ASP服务器标签中嵌入一个JS变量,它本身已嵌入到Javascript中?这是针对本地原型,安全问题不是问题。
谢谢,
汤姆。
答案 0 :(得分:2)
一个是服务器端,另一个是客户端,你不能混合两个。
当您在服务器端以id作为变量执行此操作时,它将中断,因为在服务器端上下文中不存在id。
为什么不尝试在客户端分解声明?
var id = "Hello";
var actionInit = "<%: Url.Action("GraphDetails", "Dashboard", new { area = "Anglian"}) %>";
win.attachURL(actionInit + "?OSName=" + id");
注意:附加?OSName
时,如果您的路线未正确映射100%,则可能会出现问题。例如。你得到/Dashboard/GraphDetails?area="Anglian"
并附加另一个“?”这将是一个无效的URL。另一方面,如果您的路线匹配100%并且您追加"&OSName".
,它也将无效。所以只需先检查一下
答案 1 :(得分:1)
我认为你不能。在这种情况下,至少&lt;%:...%&gt; part在页面加载时评估,永远不会再运行。
相反,您可以在JavaScript中计算,例如
var id = "Hello";
var baseURL = '<%: Url.Action("GraphDetails", "Dashboard",
new { area = "Anglian" }) %>';
win.attachURL(baseURL + '&OSName=' + id);
然而,这会假设您如何组装该路线的路线参数。您可以使用Url.Action生成具有虚拟值的完整路径,然后替换,例如
var id = "Hello";
var baseURL = '<%: Url.Action("GraphDetails", "Dashboard",
new { area = "Anglian", OSName="ZZZ" }) %>';
win.attachURL(baseURL.replace('ZZZ', id);
然后有一个微妙的机会,这可能会出错,特别是如果你将用户生成的字符串提供给字符串中的其他参数,他们可以点击你替换的值。
如果你真的想再次运行Url.Action,你必须使用参数获取URL回到已知URL的AJAX,这实际上是过度的。