在razor块

时间:2015-08-29 22:14:42

标签: javascript c# razor asp.net-mvc-5

我正在尝试在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(即它在当前上下文中不存在)。我怎样才能做到这一点?有什么办法吗?

4 个答案:

答案 0 :(得分:2)

无法访问剃须刀块中的javascript变量。

这是因为剃刀在服务器中执行,javascript在浏览器中执行。

然而,通过查看你的代码,你似乎正在使用javascript来填充一个表,这很糟糕,有两个模式可以解决这个问题,一个解决了服务器中的所有问题,另一个解决了一切问题。浏览器。

  1. 解决服务器中的所有问题:
  2. 如果您决定要解决服务器中的所有问题,那么您的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>
    }
    
    1. 在客户端解决所有问题:
    2. 正如另一个答案所指出的,如果您使用默认路由,您只需在javascript代码中创建直接字符串并将其添加到您的页面,但请记住,在使用此解决方案时,当您的页面获取时复杂的,你的javascript将变得越来越不可维护,有一个迭代数据的for循环表明你可以从javascript UI框架中受益,例如Angular.jsKnockout.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';
    }