如何设置使用MVC4剃刀的JavaScript变量(How to set javascript va

2019-07-19 20:52发布

有人可以格式化下面的代码,这样我可以用剃刀用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-sideclient-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/ )

处理办法:

  1. 直接分配

    在这种方法中,剃刀的语法被直接分配给变量。 这是引发错误。 作为一个基准,JavaScript的速度测试只是做了数量变量的直分配。

  2. 通过`Number`构造函数传递

    在这种方法中,我们总结在通话剃刀语法到`Number`构造函数,如`号(@ ViewBag.Value)`。

  3. parseInt函数

    在这种方法中,剃刀语法放在引号内,并传递给`parseInt`功能。

  4. 返回值的函数

    在这种方法中,将创建一个函数,只是简单地采用剃刀语法作为参数,并返回。

  5. 类型检查功能

    在这种方法中,函数执行一些基本的类型检查(寻找空,基本上),如果不为空返回值。

程序:

使用上述各方法中, 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