我正在尝试在javascript中编写razor代码,我试图在razor代码中使用局部变量。以下是示例代码:
<script type="text/javascript">
for (i = 0; i < data.result.length; i++) {
$("#member-table tbody").append("<tr>");
var id = data.result[i].MemberId;
var actions = $("<td>" + @Html.ActionLink("Detay", "Edit", new { id }) + "</td>)");
}
</script>
问题是剃刀代码无法识别id
(即它在当前上下文中不存在)。我怎样才能做到这一点?有什么办法吗?
答案 0 :(得分:2)
无法访问剃须刀块中的javascript变量。
这是因为剃刀在服务器中执行,javascript在浏览器中执行。
然而,通过查看你的代码,你似乎正在使用javascript来填充一个表,这很糟糕,有两个模式可以解决这个问题,一个解决了服务器中的所有问题,另一个解决了一切问题。浏览器。
如果您决定要解决服务器中的所有问题,那么您的javascript应该从服务器请求内容并将其加载到占位符中而不更改它们,例如:
$("#myButton").click(function(){
$("#myDinamicDiv").load("/Path/ToView");
});
然后你使用razor的foreach循环来生成表格的html:
@foreach (var x in ViewBag.MyData)
{
<tr>
<td>Generate contents here, including links </td>
</tr>
}
正如另一个答案所指出的,如果您使用默认路由,您只需在javascript代码中创建直接字符串并将其添加到您的页面,但请记住,在使用此解决方案时,当您的页面获取时复杂的,你的javascript将变得越来越不可维护,有一个迭代数据的for循环表明你可以从javascript UI框架中受益,例如Angular.js和Knockout.js,事实上,你是什么做是Knockout.js在其教程(单页面应用程序)中的第三课的核心
答案 1 :(得分:1)
如果您只是使用默认路由,那么只需不要使用Razor @ Html.ActionLink。坚持使用明确的标签:
`System.ArgumentOutOfRangeException`.
...很明显,无论你当前的控制器名称取代[你的控制器 - 这里]。
(我假设你的'id'不一定是URL编码的,因此'escape'。)
答案 2 :(得分:0)
您在这里混合服务器端和客户端。您无法使用客户端变量创建@ Html.ActioLink。 Html.ActionLink在服务器上呈现,它根本没有任何关于客户端变量的线索。
如果你想使用客户端变量,比如“id”,则渲染一个普通的html链接(a)标记。
答案 3 :(得分:0)
这一次对我有用
if ('@ViewBag.DownloadLink' != '') {
window.location.href = '@ViewBag.DownloadLink';
}