【问题标题】:How do I pass razor counter into onkeyup javascript function如何将剃刀计数器传递给 onkeyup javascript 函数
【发布时间】:2018-06-07 17:12:40
【问题描述】:

我的 .cshtml 页面上有这样的看法:

@{ var counter = 0; } 
@foreach (var item in Model){    
     @Html.TextBox("name_" + @counter, item.name, 
          new { 
               @class = "form-control", 
               @onkeyup = "myFuncWithRazorCounter('My Counter: ' + @counter)" 
          })
     { counter = counter + 1; }
}    

@section scripts
{
     <script type="text/javascript">
          function myFuncWithRazorCounter(counter){ 
               var myCounter = counter; 
               console.log(myCounter);
          }
     </script>
}

假设我的模型数是 10。

当我通过输入 name_8 的文本框 id 从 onkeyup 事件侦听器调用函数时,计数器如何通过并进入 myFuncWithRazorCounter() 函数?

我希望在控制台中看到的最终结果是:My Counter: 8

【问题讨论】:

    标签: javascript razor model-view-controller


    【解决方案1】:

    您将在浏览器中收到Invalid or unexpected token 错误,如果您检查正在生成的 html,那么您将看到您正在渲染

    <input ... onkeyup="myFuncWithRazorCounter('My Counter: ' + @counter)" ... >
    

    注意@counter不会被counter的实际值替换。

    你可以解决这个问题

    @Html.TextBox("name_" + counter, item.name, new
    {
        @class = "form-control",
        @onkeyup = "myFuncWithRazorCounter(" + counter + ")",
    })
    

    请注意,@ 不是必需的。然后修改脚本为

    function myFuncWithRazorCounter(counter) { 
       var myCounter = counter; 
       console.log('My Counter: ' + counter);
    }
    

    附带说明,您生成的name 属性与您的模型无关,并且在您提交表单时不会绑定到您的模型。要了解如何为集合生成表单控件,请参阅 this answer

    【讨论】:

    • 感谢您回答我的问题。 name_ 是将文本框标识为单独的id。在@foreach{} 循环中,有用于更新的引导模式。每个循环都会产生一个新的引导更新模式。计数器用于单独识别。因此,有 10 个模态,每个模态都有 @Html.TextBox()@onkeyup = "myFuncWithRazorCounter(counter)"。如果我们不考虑表单是如何提交的,当涉及到@onkeyup = "myFuncWithRazorCounter(" + counter + ")",可以这样做:@onkeyup = "myFuncWithRazorCounter('My counter: ' " + counter + ")"?谢谢
    • 不(你试过了吗?)它需要像我展示的那样。但是你为什么要用行为污染你的标记——现在是 21 世纪——使用Unobtrusive Javascript
    • 要为集合生成form 控件,您使用for 循环,而不是foreach 循环(请参阅this answer 以获得解释
    • 试一试后,我通过调整使其工作。看看:'@onkeyup = "myFuncWithRazorCounter('我的计数器:" + @counter + "')"'
    • 再次。您不需要前导 @
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 2011-07-07
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2015-04-03
    • 2019-12-04
    • 2020-01-25
    相关资源
    最近更新 更多