2013-03-21 1 views
14

Ich habe vor kurzem meine Website von ASP.NET MVC3 (Razor) auf MVC4 (Razor2) aktualisiert, und dabei gefunden, was wie eine brechende Änderung schien die Razor View Engine.Mögliche Bruchänderung in MVC4 Razor, die mit "@: @" behoben werden kann

Das Szenario (stark vereinfacht) ist unten dargestellt.

@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> 

Dies funktioniert gut in MVC3/Razor jedoch in MVC4/Razor2 die string.Format Linie führt zu einem Fehler von:

Unexpected "string" Stichwort nach Zeichen "@". Sobald Sie in Code sind, müssen Sie Konstrukte wie "string" nicht mit "@" voranstellen.

Wenn Sie die @, der Motor verlangt Ansicht entfernen Sie dann, dass Sie die string.Format Zeile mit einem Semikolon enden. ReSharper warnt jedoch (zu Recht):

Rückgabewert der reinen Methode wird nicht verwendet.

Die beiden Korrekturen ich dafür gefunden habe, sind entweder <text> zu verwenden:

<text>@string.Format("The value {0}", x)</text> 

Oder ein neugieriger Ansatz @:@:

@:@string.Format("The value {0}", x) 

Ist das eine bekannte und dokumentierte Änderung in der Razor View Engine?

+1

Die Warnung von ReSharper in diesem Fall ist falsch und sollte ihnen oder unterdrückt gemeldet werden. Es gibt einen Unterschied zwischen dem C# -Code, der zur Entwurfszeit generiert wird, und der Laufzeit, C# wird das string.format mit einem anderen Methodenaufruf umbrechen, und daher ist es absolut gültig. Resharper sollte diese Klasse von Fehlern ignorieren (und Sie auch) –

Antwort

15

Scheint wie ein Fehler. Es arbeitet mit String:

@foreach (var x in Model) 
{ 
    @String.Format("Foo bar: {0}", x) 
} 
+1

Höchst wahrscheinlich, weil 'String' kein Schlüsselwort ist. Ein bisschen seltsames Verhalten sowieso, ich bin mir nicht sicher, warum es '@' innerhalb von Code-Blöcken erlauben würde, damit zu beginnen. –

+0

@ muss erlaubt sein, weil es gültig ist C#; es wird verwendet, um Verbatim-Strings zu deklarieren; dh. Zeichenketten, in denen Sonderzeichen exakt wiedergegeben werden. Also, "string msg =" test \ t message ";' ersetzt das '\ t' mit einem Tab, aber' string msg = @ "test \ t message"; 'lässt es als' "\ t" '. – anaximander

+0

@ muss nicht erlaubt sein und ist nicht in Razor. @ vor einem Bezeichner, um Schlüsselwörter mit Typnamen zu überschreiben. –

5

Dies ist in der Tat ein Fehler wir nicht zu beheben entschieden, beachten Sie, dass die Syntax falsch ist, da es keinen Übergang zwischen C# und Markup in diesem Fall ist.

Ich verstehe, dass Resharper hier eine Warnung zeigt, aber ich glaube, die Warnung ist falsch. Hier

ist der Fehler für die Zukunft https://aspnetwebstack.codeplex.com/workitem/458

+0

Resharper zeigt eine Warnung, aber die Laufzeitumgebung gibt die Warnung als Ausnahme aus. – rfcdejong

+0

Eine weitere Referenz: https://github.com/aspnet/Razor/issues/64 – GSerg