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