我可以在主视图中使用Javascript(带有@syntax)吗?

我可以在主视图中使用Javascript(带有@syntax)吗?,javascript,c#,asp.net-mvc,asp.net-mvc-4,razor,Javascript,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,抱歉,如果我使用了错误的术语,我对这项技术相当陌生 我有一个视图,我们称之为MainView.cshtml: <div> @RenderPartial("_Partial"); </div> <script type="text/javascript"> $(document).ready(function() { someFunctionDefinedIn_Partial(); } </script> 当我运行上面的代码时,c

抱歉,如果我使用了错误的术语,我对这项技术相当陌生

我有一个视图,我们称之为MainView.cshtml:

<div>
  @RenderPartial("_Partial");
</div>

<script type="text/javascript">
 $(document).ready(function() {
    someFunctionDefinedIn_Partial();
 }
</script>
当我运行上面的代码时,chrome控制台告诉我someFunctionDefinedIn_Partial函数不存在。我猜这是因为部分中的javascript没有进入容器

我环顾四周,发现我可以将javascript提取到它自己的.js文件中,并引用它,如本文所示:

然而,上面的帖子建议将javascript提取到它自己的单独文件.js中。如果我这样做,那么我使用的是“原始”javascript,因此我不能使用@notation从我的C#中引用变量


是否可以在我的MainView.cshtml中包含javascript,它也可以访问@语法,这样我就可以使用C#方法/变量?如果没有,是否可以创建一个外部javascript文件,但必须是一个.cshtml文件,以便我可以使用“@”语法?

我不建议您在局部视图中包含JS,因为它可以在给定视图中多次添加。看看

我建议您将部分JS移到主视图

更新

如果您没有其他选择,请考虑剃刀不能用于普通JS:< /P> 您可以做的是提取JS中所需的C#值,并在调用JS时发送它们。所以你可以:

function someFunctionDefinedIn_Partial(variableValue)
{
  // This uses the "@" syntax to access C# variables, which can be done in .cshtml
  alert("Hello. This variable is from C#: " + variableValue);
}
并从局部视图调用它:

someFunctionDefinedIn_Partial(@ClassInCSharp.Variable);
我可以在主视图中使用Javascript(带有@syntax)吗

是的,但是javascript操作的顺序非常重要。严格来说,以下javascript代码应该会出错:

console.log(myvariable);
var myvariable = "hello world!";
在定义变量之前,我正在使用它。这就是你面临的类似问题

我建议直接在视图中使用Javascript吗

绝对不会。目前大多数javascript/css/html的编写方式都是紧密耦合的。给C#添加一个耦合看起来像一个巨人。我个人的偏好是向html元素添加数据,并将javascript仅耦合到我的html。因此,不是:

<script>
var myIds = [@(string.Join(Model.People.Select(p => Id.ToString().ToArray(), ",")];
</script>
在我看来,这是一种逻辑。我对ViewModel的定义是一个表示所有必要数据点(甚至是从逻辑派生的数据点)的模型。所以我会做一些类似的事情:

public class PersonVM
{
  public DateTime BornOn { get; set; }
  public bool IsAdult { get { return /*BornOnLogic*/; } ]
}
所以在我看来,我不明白为什么有人需要直接在Javascript中使用任何C


我还建议您阅读。

您可以使用Razor@notation为JS输出变量。您在C#中访问的变量在MainView中可用吗?或者它只对部分可访问?在这种情况下,假设变量对两者都可访问。@VictorChelaru哦,那么只需将部分中的javascript拉到MainView.cshtml中即可。一般来说,分部不应包含依赖于环境中可用的特定变量的逻辑。分部代码的整个思想是它可以在任何地方加载。因此,如果您希望在分部中包含一个C#变量,那么它可能在您包含它的某个位置可用,而在另一个位置不可用,从而导致错误。@VictorChelaru还值得一提的是,将javascript从分部中拉出来并放入MainView.cshtml意味着您不必用函数污染全局javascript范围。您可以在MainView中的document.ready函数中定义它们,然后它们是该函数的本地函数。感谢您的建议,但最初的问题不是“我应该吗?”而是“我该怎么做?”没有弄乱DOM是一个原因。通过发送整个模型(尤其是angularjs)是非常有益的。您的数据id示例也可能被用户篡改。他们可以在JS运行之前在DOM中更改这些值,从而允许使用不应该使用的ID的用户进行编辑/删除等操作。使用直接从razor获取值的模糊IIFE更安全。并不是说每次都应该这样做,但肯定有合法的使用案例。事实上,这是一个命令。在Html.RenderPartial之前,我已经在主视图中定义了我的JS。如果我将主视图JS移动到RenderPartial调用之后,所有操作都会很好。@mhodges会使DOM变得混乱,但这个参数对于视图中的可维护性和re-sure VS-javascript来说是一个错误。至于发送一个模型,即安全参数,不管它是如何发送到客户端的,客户端的任何东西都不能被认为是干净的。在保持模型有效方面,没有任何技术(原始javascript、knockout、redux、react、angular)是安全的。另一方面,从视图构建JavaScript数据是构建视图的老方法。后角、反应等。它正好相反。您应该根据JavaScript数据构建视图。它更快、更安全、更可靠。千万不要相信你的HTML,它太容易操作了。@mhodges更多?暂停javascript执行并更改dom元素或更改chrome内存中的脚本有多难?大约同样的努力(我都做过),他们都是可笑的容易。更改json响应也非常容易。
<div data-id="@model.Id" class="person">
  Person Name: @Html.DisplayFor(m => m.name)
</div>

<script>
var myIds = [];
$('.person').each((i,p) => myIds.push($(p).data("Id"));
</script>
@foreach(var person in Model.persons) 
{
  if (person.Age >= 21)
  {
    <div>Adult</div>
  }
  else
  {
    <div>Child</div>
  }
}
public class PersonVM
{
  public DateTime BornOn { get; set; }
  public bool IsAdult { get { return /*BornOnLogic*/; } ]
}