我有一个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具有值,因为它们在调用之前打印在视图上。有没有办法在我的视图上设置一个断点,看看它打印前的百分比是多少?
答案 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.TotalRedeemed
和item3.TotalSold
必须为float
或double
。如果它们是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,我就重新开始运行了。