在Razor中关闭了条件编译?

Gal*_*len 12 javascript razor asp.net-mvc-3

我有一个ac#foreach循环正在输出一些javascript来初始化我的剃刀视图上的一些进度条.

@foreach (var item3 in Model)
{
    @:$("#campaignMeter-@item3.ID").wijprogressbar({ value: @((item3.TotalRedeemed / item3.TotalSold) * 100), fillDirection: "east" });

}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是visual studio在foreach循环上报告"条件编译被关闭",并且值的小计算总是为0,尽管TotalRedeemed和TotalSold具有值.我正确使用@:运算符吗?谢谢你的帮助.

到目前为止,我已经尝试过这两个建议,这就是我现在所拥有的:

 @foreach (var item3 in Model)
 {

     var percentage = (item3.TotalRedeemed / item3.TotalSold) * 100;

     <text>$("#campaignMeter-@item3.ID").wijprogressbar({ value: @percentage, fillDirection: "east" });</text>

 }
Run Code Online (Sandbox Code Playgroud)

百分比显示为0,但TotalRedeemed和TotalSold具有值,因为它们在调用之前打印在视图上.有没有办法在我的视图上设置一个断点,看看它打印前的百分比是多少?

J R*_*J R 31

Timmi4sa - 我同意,关于我们为什么会收到此错误的答案并不多.我终于更接近理解这一切,所以我想我会分享.

条件编译定义为我的MS如下:

条件编译使JScript能够使用新的语言功能,而不会牺牲与不支持这些功能的旧版本的兼容性.条件编译的一些典型用法包括在JScript中使用新功能,将调试支持嵌入到脚本中以及跟踪代码执行.

据我所知,我们真的在谈论VS的一个特性.我目前的猜测是:VS允许你调试JS,但它必须知道JS是为了调试它.默认情况下条件编译是关闭的 - 我猜测还有一些额外的开销.当我们在JS中使用@Model时我们正在做的事情就是完全按照警告的状态(或多或少)来创建条件JS.根据我们的C#/ VB变量的值,JS最终会变成不同的东西.

根据MS,解决方案是通过声明如上所述打开条件编译:

/*@cc_on @*/
Run Code Online (Sandbox Code Playgroud)

虽然我倾向于有点肛门并且更愿意避免警告,但这可能是我只是忽略的一个(除非有人可以进一步教育我为什么这是一个坏主意).

如果你真的希望错误消失并且不喜欢Conditional Compilation标志,你可以用下面的双引号包装C#/ VB代码调用.但是这感觉很脏并且只能工作,因为JS是松散类型的...(无论如何,数字类型,字符串应该没有问题......无论如何,这感觉很hacky)

"@Model.Items.Count()"
Run Code Online (Sandbox Code Playgroud)

编辑:我去做了一些研究......在浏览这篇文章之后,我更喜欢CC的想法:http://www.javascriptkit.com/javatutors/conditionalcompile.shtml.我想我会忽略这个警告.

我希望这有助于解释一些谜团.

编辑:

另一种选择是在表单上抛出一个HiddenFor,给它一个Id,然后从该字段填充一个JS变量(jQuery使这很容易).这就是我暂时做的事情.它消除了警告,我经常想要将JS变量与原始的VMC字段进行比较.对于那些需要它的人:

@* Somewhere in your form - assuming a strongly typed view *@
@Html.HiddenFor(x => x.YourField, new { id = "SomethingMeaningful" })

// and then in your JS
$(document).ready(function(){
  ...
  var jsYourField = $("#SomethingMeaningful").val();
  ...
});
Run Code Online (Sandbox Code Playgroud)

请注意,JS变量和MVC变量并不总是"排列"完全正确,因此当您将变量值复制到JS中时,可能需要进行一些转换或其他工作.


Mrc*_*ief 6

添加/*@cc_on @*/您的代码.

更新:找出他们为什么会0:

item3.TotalRedeemed并且item3.TotalSold需要floatdouble.如果是的话int,它就会出现0.