在Razor文件中使用c#代码和函数

本文关键字:代码 函数 Razor 文件 | 更新日期: 2023-09-27 18:01:29

我有一个使用剃刀函数的问题。我有一个实体存储的列表。我写了一个剧本,但是出了问题。我以前从来没有做过这个。我不擅长HTML或Jscript等。

<标题> 我的代码
    @model IEnumerable<Contact>
    <script>
       var name = document.getElementById("nameBox").value;
       function nameBoxOperations(name) {
           @foreach (var names in @Model)
           {
               if (names.givenName == name)
               {
                   //OPERATIONS
               }
           }
       }
    </script>

在这段代码中,我想检查输入,如果它已经存储在我的列表中。但我无法触及"名字"变量。如果我写@string name = document.getElementById("nameBox".value;"它会返回一个错误,我不知道。

在Razor文件中使用c#代码和函数

您可以尝试以下解决方案:

@model IEnumerable<Contact>
<script>
     var name = document.getElementById("nameBox").value;
     var collection = '@(Model.Select(x => x.givenName).Aggregate((a, b) => a + "," + b))'.split(',');        
     function nameBoxOperations(name) {
          for(var i = 0; i < collection.length; i++)           
               if (collection[i] == name)
               {
                   //OPERATIONS
               }           
          }
</script>

获取页面时,Razor在服务器上运行。它的主要目的是生成页面内容:

@foreach (var names in @Model)
{
    <p>User name: @name</p>
}

如果你检查抓取页面的网络结果,你会看到结果不包含任何Razor代码。这是因为Razor完全运行在服务器上,只有它的结果才会显示给客户端:

<p>User name: Bob</p>
<p>User name: Jimmy</p>
<p>User name: Glover</p>

没有剃刀到达客户端。

您似乎希望Razor代码作为Javascript的一部分在客户端运行。Razor不是一种客户端语言。因此,Razor将无法评估客户端javascript参数name。从Razor的角度来看,JavaScript函数和参数的声明只是内容。

如果您希望能够从javascript遍历ViewModel中的名称,那么您可以将ViewModel转换为JSON对象:

var nameListJson = @(Html.Raw(Json.Encode(Model)));
function nameBoxOperations(name) 
{
   for (i = 0; i < nameListJson.length; i++) { 
       console.log( nameListJson[i] );
   }
}

我已经展示了一个循环,但是无论您需要做什么,现在都可以访问模型中的数据。你只需要在循环和访问模型时使用javascript。

如果您查看所检索页面的内容,您将看不到Razor。相反,您将看到一个内联JSON对象。

这是一个相当非常规的方法。根据您的应用程序,可能有更好的方法。根据你的问题,听起来你可能应该花更多的时间在教程和例子上,看看哪些是更常见的做法。这些将使您更好地了解MVC是如何工作的,以及构建应用程序的一些知识块。

当在c#代码块中使用Javascript时,您应该在每行的开头使用@:

您可以使用以下代码:

@model IEnumerable<Contact>
<script>
   var name = document.getElementById("nameBox").value;
   function nameBoxOperations(name) {
       @foreach (var names in @Model)
       {
           @:if (names.givenName == name)
           {
               @:alert('name matched');
               //OPERATIONS
           }
       }
   }
</script>

你把JS和c#混在一起了,这是没有完成的。错误一定会发生。简单的解决方案是为您输入更多使用Ajax的JS代码(例如通过jQuery,这比JS的Ajax编码更直接)将数据获取到另一个JS变量中,如数组或其他东西。然后你就可以循环了。你必须学习一些jQuery才能做到这一点。