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

时间:2016-08-09 06:03:13

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

我在剃刀中使用函数时遇到问题。我有一个我的实体存储的列表。我写了一个脚本,但有些不对劲。我以前从未这样做过。我不擅长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;”它返回一个我不知道的错误。我怎么才能达到它,谢谢

4 个答案:

答案 0 :(得分:1)

您可以尝试此解决方案:

@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>

答案 1 :(得分:0)

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。

如果您查看检索到的网页内容,您将看不到剃刀。相反,您将看到内联JSON对象。

然而,这是一种非常规的方法。根据您的应用,可能有更好的方法。基于您的问题,听起来您可能应该花更多时间在教程和示例中查看更常见的做法。这些将使您更好地了解MVC的工作原理,以及构建应用程序的一些知识构建块。

答案 2 :(得分:0)

在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>

答案 3 :(得分:0)

您正在将JS与C#混合,但尚未完成。必须发生错误。简单的解决方案是让您输入更多使用Ajax的JS代码(例如通过jQuery,这比JS'Ajax编码简单得多)将数据提取到另一个JS变量,如Array或其他东西。然后,你可以循环。你必须学习一些jQuery才能做到这一点。