有人可以格式化下面的代码,这样我可以用剃刀用C#代码中设置srcript变量?
下面是不行的,我知道了这样做很容易让别人帮助。
@{int proID = 123; int nonProID = 456;}
<script type="text/javascript">
@{
<text>
var nonID =@nonProID;
var proID= @proID;
window.nonID = @nonProID;
window.proID=@proID;
</text>
}
</script>
我得到一个设计时错误
Answer 1:
你应该看看你的剃刀页面产生的输出。 其实,你需要知道什么是执行server-side
和client-side
。 试试这个:
@{
int proID = 123;
int nonProID = 456;
}
<script>
var nonID = @nonProID;
var proID = @proID;
window.nonID = @nonProID;
window.proID = @proID;
</script>
输出应该是这样的:
根据你使用的是什么版本的Visual Studio,这一点在设计时的一些要点与剃刀意见。
Answer 2:
这是我如何解决了这个问题:
@{int proID = 123; int nonProID = 456;}
<script type="text/javascript">
var nonID = Number(@nonProID);
var proID = Number(@proID);
</script>
这是自记录文件,它不涉及转换和文字。
注意:要小心使用的Number()
函数无法创建new Number()
对象-因为恰好等于运营商可以表现在非明显的方式:
var y = new Number(123); // Note incorrect usage of "new"
var x = new Number(123);
alert(y === 123); // displays false
alert(x == y); // displays false
Answer 3:
因为当你在视图中工作剃刀语法错误,就会成为一个问题,我完全明白你为什么会想避开他们。 这里有一对夫妇的其他选项。
<script type="text/javascript">
// @Model.Count is an int
var count = '@Model.Count';
var countInt = parseInt('@Model.ActiveLocsCount');
</script>
引号作为分隔符,所以剃须刀解析器是幸福的。 不过,当然你的C#INT成为第一个语句JS字符串。 对于纯粹主义者,第二个选项可能会更好。
如果有人有这样做没有剃刀语法错误,特别是保持的类型var更好的办法,我很想看看吧!
Answer 4:
我已经看到了几种方法来周围的bug的工作,和我进行了一些时间测试,看速度是什么在起作用( http://jsfiddle.net/5dwwy/ )
处理办法:
- 直接分配
在这种方法中,剃刀的语法被直接分配给变量。 这是引发错误。 作为一个基准,JavaScript的速度测试只是做了数量变量的直分配。
- 通过`Number`构造函数传递
在这种方法中,我们总结在通话剃刀语法到`Number`构造函数,如`号(@ ViewBag.Value)`。
- parseInt函数
在这种方法中,剃刀语法放在引号内,并传递给`parseInt`功能。
- 返回值的函数
在这种方法中,将创建一个函数,只是简单地采用剃刀语法作为参数,并返回。
- 类型检查功能
在这种方法中,函数执行一些基本的类型检查(寻找空,基本上),如果不为空返回值。
程序:
使用上述各方法中, for-loop
重复每个函数调用10M次,得到用于整个循环的总时间。 然后,for循环重复30次,得到每10M的动作的平均时间。 那么这些时间进行相互比较,以确定哪些行为是比别人快。
需要注意的是,因为它是JavaScript的运行,实际的数字以外的人接受将不同,但重要的是不实际的数字,但数字如何比较其他的数字。
结果:
使用直接分配方法,平均时间来处理10M任务是98.033ms。 使用Number
构造每秒产生10M 1554.93ms。 同样, parseInt
方法了1404.27ms。 这两个函数调用进行了简单的功能97.5ms和101.4ms的更复杂的功能。
结论:
最干净的代码来理解是直接分配。 然而,因为在Visual Studio中的bug,这个报告错误,并可以与智能感知导致的问题,并给被错误模糊感。
最快的代码是简单的函数调用,而只是以微弱优势。 由于我没有做进一步的分析,我不知道这种差异有统计学意义。 类型检查功能也非常快,只比直接分配稍慢,包括可能的变量可以为空。 这不是真正实用,不过,因为如果该参数是不确定的(在剃刀语法空)连基本功能都将返回undefined。
解析剃刀值作为一个int,并通过构造函数运行它都非常慢,比直接分配慢15倍的数量级。 最有可能的Number
构造内部实际上是调用parseInt
,这可以解释为什么它不是一个简单的需要更长的时间parseInt
。 然而,他们确实有被更有意义的优势,而无需外部定义(即文件或应用程序中的其他地方)函数来执行,与Number
构造函数实际上是一个整数的可见铸造减少为一个字符串。
底线,这些数字产生通过10M反复运行。 在一个单一的项目,速度是不可估量的小。 对于大多数,只需通过运行该Number
的构造可能是最可读的代码,尽管是最慢的。
Answer 5:
@{
int proID = 123;
int nonProID = 456;
}
<script>
var nonID = '@nonProID';
var proID = '@proID';
window.nonID = '@nonProID';
window.proID = '@proID';
</script>
Answer 6:
与其说是一个答案,一个警示:这是窃听我以及-我想我不得不挂起的预零和使用的解决方案@(...)
语法。 即你的代码将是:
var nonID = 0@(nonProID);
var proID = 0@(proID);
获得输出,如:
var nonId = 0123;
我没有意识到的是,这是JavaScript的(第3版)如何代表的八进制/基8号和实际上是改变值。 此外,如果您使用的是"use strict";
命令然后它会破坏你的代码完全为八进制数字已被删除。
我还在寻找一个妥善的解决了这一点。
Answer 7:
它的工作原理,如果你做这样的事情:
var proID = @proID + 0;
它产生的代码是一样的东西:
var proID = 4 + 0;
有点奇怪肯定的,但至少没有更多的假语法错误。 可悲的是错误仍然报告VS2013,所以这并没有得到妥善解决(至今)。
Answer 8:
我一直在寻找到这种方法:
function getServerObject(serverObject) {
if (typeof serverObject === "undefined") {
return null;
}
return serverObject;
}
var itCameFromDotNet = getServerObject(@dotNetObject);
对我来说,这似乎让你结束了一个空变量JS侧......最坏的情况下更安全。
Answer 9:
我发现了一个非常干净的解决方案,允许单独的逻辑和GUI:
在你的剃须刀.cshtml网页试试这个:
<body id="myId" data-my-variable="myValue">
...your page code here
</body>
在你的.js文件或.TS(如果你使用的打字稿)从视图读取存储值放一些这样的(需要jQuery库):
$("#myId").data("my-variable")
Answer 10:
其中一个简单的方法是:
<input type="hidden" id="SaleDateValue" value="@ViewBag.SaleDate" />
<input type="hidden" id="VoidItem" value="@Model.SecurityControl["VoidItem"].ToString()" />
然后可以在javascript中的价值:
var SaleDate = document.getElementById('SaleDateValue').value;
var Item = document.getElementById('VoidItem').value;
Answer 11:
我用一个很简单的function
,以解决身体语法错误JavaScript
与混合代码Razor
代码;)
function n(num){return num;}
var nonID = n(@nonProID);
var proID= n(@proID);
Answer 12:
这应涵盖所有主要类型:
public class ViewBagUtils
{
public static string ToJavascriptValue(dynamic val)
{
if (val == null) return "null";
if (val is string) return val;
if (val is bool) return val.ToString().ToLower();
if (val is DateTime) return val.ToString();
if (double.TryParse(val.ToString(), out double dval)) return dval.ToString();
throw new ArgumentException("Could not convert value.");
}
}
而在这里面你.cshtml文件<script>
标记:
@using Namespace_Of_ViewBagUtils
const someValue = @ViewBagUtils.ToJavascriptValue(ViewBag.SomeValue);
请注意,对于字符串值,你就必须使用@ViewBagUtils
表达式中单(或双)引号,像这样:
const someValue = "@ViewBagUtils.ToJavascriptValue(ViewBag.SomeValue)";
文章来源: How to set javascript variables using MVC4 with Razor