有嵌入的JavaScript代码块与如何将Razor C#代码嵌入到.js文件中?
<script type='text/javascript'>
...
</script>
但剃刀代码将无法在.js
文件编译,从.cshtml
文件包括在内。
如何使这项工作?或者有没有其他优雅的方法可以产生类似的效果?
谢谢。
有嵌入的JavaScript代码块与如何将Razor C#代码嵌入到.js文件中?
<script type='text/javascript'>
...
</script>
但剃刀代码将无法在.js
文件编译,从.cshtml
文件包括在内。
如何使这项工作?或者有没有其他优雅的方法可以产生类似的效果?
谢谢。
当我面对这个问题,有时我会提供的.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" />
你不能。你甚至不应该尝试。保持它们分开。这反过来,但你应该看看Unobtrusive JavaScript。整个项目中应用的设计模式是一个好主意。
我尝试了Unobtrusive JavaScript,但在某些情况下,我需要更新不同的元素,或者更新一个可能使用jQuery语句$('#bla')。parent()检索的'parent'元素,根据回应。我可能没有深入研究它,但AFAIK它不能满足我的需要。 – 2012-02-23 10:07:17
也许我可以提供一个有用的解决方法,取决于你想完成什么。
我很想找到一种方法来评估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文件。
下面是一个示例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>
而关于其中只包含的JS .cshtml什么?包含
.csthml父
@RenderPage("_scripts.cshtml")
_scripts.cshtml的js
<script type="text/javascript">
alert('@Datetime.ToString()');
</script>
...动态生成的JavaScript人民遭受可怕。由于JavaScript文件是静态的,因此不会将JavaScript代码嵌入到JavaScript文件中。 – Raynos 2012-02-23 03:18:33
如果您想解决您尝试解决的问题的解决方案,您会更好。所以,首先详细说明问题,然后尝试解决方案。你目前试图解决这个问题的方式并不好。 – Paul 2012-02-23 03:28:07
我会试着找到一个更一般的解决方案,否则我需要在这里问很多次不同的情况。 – 2012-02-23 10:09:24