asp.net-mvc:js 文件中的剃刀“@”符号

IT技术 c# javascript asp.net-mvc asp.net-mvc-3 razor
2021-02-11 17:12:33

我有一个.csHtml带有 javascript 函数-razor 文件,该函数使用@Url.Content内部C# 函数作为 ajax URL。
我想将该函数移动到.js从我的视图中引用文件中。

问题是 javascript 不“知道”@符号并且不解析 C# 代码。
有没有办法.js用“@”符号从视图中引用文件?

6个回答

您可以使用 HTML5data-*属性。假设您想在单击某个 DOM 元素(例如 div)时执行某些操作。所以:

<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>

然后在您单独的 javascript 文件中,您可以不显眼地使用 DOM:

$('#foo').click(function() {
    var url = $(this).data('url');
    // do something with this url
});

通过这种方式,您可以在标记和脚本之间实现纯粹的分离,而无需在 javascript 文件中添加任何服务器端标签。

谢谢。我认为对于多个值可能会很头疼。首先,我认为它可以解决我的问题,但在尝试之后,我在我的代码中发现了很多引用,并决定寻找另一种方法。
2021-04-10 17:12:33

好吧,我刚刚在 nuget 上找到了一个可以做到这一点的剃须刀引擎!意义解决@语法!
它的名字是RazorJS

的NuGet


2016更新:
包5年未更新,项目站点链接失效。我不建议人们再使用这个库。

@gdoron,没问题。我只是想让你知道死链接。正如您所说,该软件包已有 5 年未更新,因此无论如何使用它可能是个坏主意。
2021-03-15 17:12:33
@MemetOlsen,确实,抱歉,但我找不到它的副本,所以我删除了它:(
2021-03-18 17:12:33
2021-03-21 17:12:33
第一个链接坏了
2021-03-31 17:12:33

解决问题的一种方法是:

将带有 javascript 函数的局部视图添加到视图中。
这样您就可以使用@符号,并且您的所有javascript功能都与视图分离。

这行不通,局部视图将被渲染,JS 将在最后的主 HTML 中......
2021-03-26 17:12:33

您有两个选择:

  • 在函数中使用该值作为参数并在视图中进行接线
  • 创建一个命名空间(而不是公共级别的变量,这在 JS 中被认为是不好的做法)并将这个值设置在页面的顶部,然后在你的 js 中使用它

例如:

 var MyCompany = 
 {
   MyProject: {
                  MyVariable:""
               }
  };

然后在您看来,设置它:

MyCompany.MyProject.MyVariable = @....

更新

您可能想知道没有任何好处是因为耦合,这是真的,您正在耦合 js 和视图。这就是为什么脚本必须不知道它们正在运行的位置的原因,因此这是文件组织非最佳症状。

无论如何,还有第三种选择来创建视图引擎并针对剃刀运行 js 文件并将结果发回。这更干净,但速度要慢得多,所以也不推荐。

+1我做第一种方法。从您的视图中调用初始化函数,传入您需要的所有数据。
2021-03-19 17:12:33
谢谢,第二种方法不是视图和 js 文件之间的不良耦合吗?你有更好的方法吗?
2021-03-27 17:12:33
我建议的这种方式怎么样?stackoverflow.com/questions/7902213/...
2021-04-06 17:12:33
听起来不错。我的+1。无论是局部还是完整视图,都不会改变任何东西。都是js的耦合视图。
2021-04-10 17:12:33
两者都是耦合的。没有办法解耦,除非你在渲染之前写了一个视图引擎来处理js文件。查看我的更新。
2021-04-11 17:12:33

为了将@变量放入您的 .js 文件中,您必须使用全局变量并从使用该 .js 文件的 mvc 视图中设置该变量的值。

JavaScript 文件:

var myValue;

function myFunc() {
  alert(myValue);
}

MVC 视图文件:

<script language="text/javascript">
    myValue = @myValueFromModel;
</script>

只要确保对您的函数的任何调用都发生在视图设置值之后。

直接将 myValue 作为参数传递给函数怎么样?与依赖全局变量相比,我更喜欢使用 param 进行显式调用,但是我对 javascript 并不那么热衷,所以我可能会错过拥有全局变量的一些重要方面。
2021-03-16 17:12:33
@BigMike:当然可以接受。我上面提出的方法只是让变量同时对多个函数可用,但使用参数也一样好。
2021-03-27 17:12:33
感谢您的澄清。自动拥有某种 js 对象版本的模型会很棒(通过模型类中的属性会很棒),这只会添加一个模式和一个完全命名空间感知的变量解决方案。我想最大的问题是如何在发送到浏览器的生成的 html 中注入代码(直接通过 <script> 标签)。我想我会在我当前的项目结束后立即对此进行一些实验。
2021-04-12 17:12:33
@BigMike:使用 DataContractJsonSerializer 类 ( msdn.microsoft.com/en-us/library/... )应该很容易完成它会创建一个可以解析到视图中的类的 JSON 版本。
2021-04-13 17:12:33