2012-02-23 36 views
11

有嵌入的JavaScript代码块与如何将Razor C#代码嵌入到.js文件中?

<script type='text/javascript'> 
    ... 
</script> 

但剃刀代码将无法在.js文件编译,从.cshtml文件包括在内。

如何使这项工作?或者有没有其他优雅的方法可以产生类似的效果?

谢谢。

+1

...动态生成的JavaScript人民遭受可怕。由于JavaScript文件是静态的,因此不会将JavaScript代码嵌入到JavaScript文件中。 – Raynos 2012-02-23 03:18:33

+0

如果您想解决您尝试解决的问题的解决方案,您会更好。所以,首先详细说明问题,然后尝试解决方案。你目前试图解决这个问题的方式并不好。 – Paul 2012-02-23 03:28:07

+0

我会试着找到一个更一般的解决方案,否则我需要在这里问很多次不同的情况。 – 2012-02-23 10:09:24

回答

18

当我面对这个问题,有时我会提供的.js文件是在.cshtml文件访问的功能...

// someFile.js 
var myFunction = function(options){ 
    // do stuff with options 
}; 

// razorFile.cshtml 
<script> 
    window.myFunction = new myFunction(@model.Stuff); 
    // If you need a whole model serialized then use... 
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model))); 
</script> 

不一定是最好的选择,但它会怎么做,如果你必须这样做......

你也许可以尝试用你的HTML元素,如jQuery.validate.unobtrusive如何做数据属性的另一件事......

//someFile.js 
var options = $("#stuff").data('stuff'); 

// razorFile.cshtml 
<input type="hidden" id="stuff" data-stuff="@model.Stuff" /> 
+0

+1,我也在视图中设置变量/ js对象。通常这是需要通过ajax访问的URL的情况。例如'' – RPM1984 2012-02-23 04:16:03

+0

我喜欢他的第二个选项。它有点奇怪,但它有效。 – mdance 2014-04-16 16:40:07

+0

您可以在cshtml视图中添加一个“section”,并定义一个变量,如:variable = @ Model.Parameter。在您开始定义的js文件中:'var Parameter;'然后您可以访问这个变量在js文件中只需输入Parameter就可以了。 – Levimatt 2016-09-23 09:22:43

4

你不能。你甚至不应该尝试。保持它们分开。这反过来,但你应该看看Unobtrusive JavaScript。整个项目中应用的设计模式是一个好主意。

+0

我尝试了Unobtrusive JavaScript,但在某些情况下,我需要更新不同的元素,或者更新一个可能使用jQuery语句$('#bla')。parent()检索的'parent'元素,根据回应。我可能没有深入研究它,但AFAIK它不能满足我的需要。 – 2012-02-23 10:07:17

1

虽然我同意你应该考虑在JavaScript文件中使用Razor,有一个Nuget包可以帮助你。它被称为RazorJS

该软件包的作者有一个blog post关于它,这解释了如何使用它。

0

也许我可以提供一个有用的解决方法,取决于你想完成什么。

我很想找到一种方法来评估java脚本文件中的剃刀表达式。我想附加一个jQuery点击事件处理程序来提交在许多页面上找到的特定类。这应该在jQuery文档就绪事件处理程序中完成。此点击事件将执行ajax调用。

这些应用程序的url应该是相对的,而不是绝对的,以防应用程序在根级别以下。所以,我想用类似

$(document).ready(function() { 
    $('input[type="submit"].checkit)').click(function (e) { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Content("~/checkit")', //Razor expression here 
      dataType: 'json', 
      success: function (data) { 
       if (!data) { 
        e.preventDefault(); 
        handleResponse(data); 
       } 
      }, 
      data: null, 
      async: false 
     }); 
    }); 
}); 

我通过包装的代码的函数Checkit和呼叫移动到布局视图解决了这个:

 $(document).ready(function() { 
      Checkit('@Url.Content("~/checkit")'); 
     }); 

大多数的JavaScript代码仍然在一个JavaScript文件。

3

下面是一个示例Razor网页(不是MVC视图,虽然它会类似),它将为Javascript提供服务。当然,动态编写Javascript文件是非典型的,但这里还是一个例子。我曾经使用过这种情况,我希望提供JSON数据和其他一些计算成本昂贵并且很少更改的东西,因此浏览器可以将其包含并像缓存JS文件一样缓存。这里的诀窍就是设置Response.ContentType,然后为您的Javascript使用诸如Razor <text>标签之类的标签。

@{ 
Response.ContentType = "text/javascript"; 
Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime); 
Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28)); 
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public); 
<text> 
var someJavaScriptData = @someSortOfObjectConvertedToJSON; 
function something(whatever){ 
} 
</text> 
} 

然后,您可以将它包括为使您的其他剃刀文件:

<script src="MyRazorJavascriptFile.cshtml"></script> 
0

而关于其中只包含的JS .cshtml什么?包含

.csthml父

@RenderPage("_scripts.cshtml") 

_scripts.cshtml的js

<script type="text/javascript"> 
alert('@Datetime.ToString()'); 
</script>