Can someone format the code below so that I can set srcript variables with c# code using razor?
The below does not work, i've got it that way to make is easy for someone to help.
@{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>
I am getting a design time error
One of the easy way is:
And then get the value in javascript:
I found a very clean solution that allows separate logic and GUI:
in your razor .cshtml page try this:
in your .js file or .ts (if you use typeScript) to read stored value from your view put some like this (jquery library is required):
I've seen several approaches to working around the bug, and I ran some timing tests to see what works for speed (http://jsfiddle.net/5dwwy/)
Approaches:
In this approach, the razor syntax is directly assigned to the variable. This is what throws the error. As a baseline, the JavaScript speed test simply does a straight assignment of a number to a variable.
In this approach, we wrap the razor syntax in a call to the `Number` constructor, as in `Number(@ViewBag.Value)`.
In this approach, the razor syntax is put inside quotes and passed to the `parseInt` function.
In this approach, a function is created that simply takes the razor syntax as a parameter and returns it.
In this approach, the function performs some basic type checking (looking for null, basically) and returns the value if it isn't null.
Procedure:
Using each approach mentioned above, a
for-loop
repeats each function call 10M times, getting the total time for the entire loop. Then, that for-loop is repeated 30 times to obtain an average time per 10M actions. These times were then compared to each other to determine which actions were faster than others.Note that since it is JavaScript running, the actual numbers other people receive will differ, but the importance is not in the actual number, but how the numbers compare to the other numbers.
Results:
Using the Direct assignment approach, the average time to process 10M assignments was 98.033ms. Using the
Number
constructor yielded 1554.93ms per 10M. Similarly, theparseInt
method took 1404.27ms. The two function calls took 97.5ms for the simple function and 101.4ms for the more complex function.Conclusions:
The cleanest code to understand is the Direct assignment. However, because of the bug in Visual Studio, this reports an error and could cause issues with Intellisense and give a vague sense of being wrong.
The fastest code was the simple function call, but only by a slim margin. Since I didn't do further analysis, I do not know if this difference has a statistical significance. The type-checking function was also very fast, only slightly slower than a direct assignment, and includes the possibility that the variable may be null. It's not really practical, though, because even the basic function will return undefined if the parameter is undefined (null in razor syntax).
Parsing the razor value as an int and running it through the constructor were extremely slow, on the order of 15x slower than a direct assignment. Most likely the
Number
constructor is actually internally callingparseInt
, which would explain why it takes longer than a simpleparseInt
. However, they do have the advantage of being more meaningful, without requiring an externally-defined (ie somewhere else in the file or application) function to execute, with theNumber
constructor actually minimizing the visible casting of an integer to a string.Bottom line, these numbers were generated running through 10M iterations. On a single item, the speed is incalculably small. For most, simply running it through the
Number
constructor might be the most readable code, despite being the slowest.This should cover all major types:
And in your .cshtml file inside the
<script>
tag:Note that for string values, you'll have to use the
@ViewBagUtils
expression inside single (or double) quotes, like so:This is how I solved the problem:
It is self-documenting and it doesn't involve conversion to and from text.
Note: be careful to use the
Number()
function not createnew Number()
objects - as the exactly equals operator may behave in a non-obvious way: