在Razor中关闭了条件编译?

时间:2011-07-11 19:52:33

标签: javascript asp.net-mvc-3 razor

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

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

}

我遇到的问题是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>

 }

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

4 个答案:

答案 0 :(得分:31)

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

条件编译定义为我的MS:

  

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

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

根据MS,解决方案是通过语句

打开如上所述的条件编译
/*@cc_on @*/

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

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

"@Model.Items.Count()"

编辑:我去做了一些研究......在略读这篇文章之后,我更喜欢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();
  ...
});

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

答案 1 :(得分:6)

在代码中添加/*@cc_on @*/

更新:了解原因0

item3.TotalRedeemeditem3.TotalSold必须为floatdouble。如果它们是int,则会显示0

答案 2 :(得分:2)

试试这个:

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

}

但更好的方法是在视图模型属性上执行此计算,以便您的视图如下所示:

@foreach (var item in Model)
{
    <text>$('#campaignMeter-@(item.ID)').wijprogressbar({ 
        value: @item.SoldPercentage, 
        fillDirection: "east" 
    });</text>
}

答案 3 :(得分:0)

我以为我会分享对我有用的东西,

我遇到了同样的问题:System.Web.HttpCompileException(0x80004005)

在我得到的例外情况下:名称“网址”不存在

当我查看View时,我注意到唯一使用Url的地方是剃刀代码@Url。

这篇文章谈到了对剃刀和MVC的引用。

当我查看解决方案中的Views文件夹时,有一个包含所有引用的web.config文件,但它被重命名为web.src.config。一旦我将其更改为web.config,我就重新开始运行了。