I recently upgraded my website from ASP.NET MVC3 (Razor) to MVC4 (Razor2), and in doing so found what seemed like a breaking change in the Razor view engine.
The scenario (greatly simplified) is shown below.
@model IEnumerable<string>
@{ Layout = null; }
<!DOCTYPE html>
<html>
<body>
<div>
@foreach (var x in Model)
{
@string.Format("Foo bar: {0}", x) // Errors in MVC4/Razor2
}
</div>
</body>
</html>
This works fine in MVC3/Razor, however in MVC4/Razor2 the string.Format
line results in an error of:
Unexpected "string" keyword after "@" character. Once inside code, you do not need to prefix constructs like "string" with "@".
If you remove the @
, the view engine then demands that you terminate the string.Format
line with a semicolon. However, ReSharper then warns (rightly so):
Return value of pure method is not used.
The two fixes I've found for this are either to use <text>
:
<text>@string.Format("The value {0}", x)</text>
Or a more curious approach using @:@
:
@:@string.Format("The value {0}", x)
Is this a known and documented change in the Razor view engine?
Seems like a bug. It works with String
:
@foreach (var x in Model)
{
@String.Format("Foo bar: {0}", x)
}
This is indeed a bug we decided not to fix, note that the syntax is incorrect as there is no transition between C# and markup in this case.
I understand that resharper shows a warning here but I believe the warning is wrong.
Here is the bug for future reference https://aspnetwebstack.codeplex.com/workitem/458
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With