2013-03-21 11 views
14

Recentemente ho aggiornato il mio sito web da ASP.NET MVC3 (Razor) a MVC4 (Razor2), e così facendo ho trovato quello che sembrava un cambiamento in il motore di visualizzazione Razor.Possibile modifica di rottura in MVC4 Razor che può essere riparato con "@: @"

Lo scenario (notevolmente semplificato) è illustrato di seguito.

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

Questo funziona bene in MVC3/Razor, ma in MVC4/Razor2 i string.Format risultati di linea in un errore di:

imprevisto parola chiave "stringa" dopo il carattere "@". Una volta all'interno del codice, non è necessario prefisso di costrutti come "stringa" con "@".

Se si rimuove il @, il motore di visualizzazione allora chiede che si termina la linea string.Format con un punto e virgola. Tuttavia, ReSharper avvisa (giustamente):

Il valore restituito del metodo puro non viene utilizzato.

Le due correzioni che ho trovato per questo sono o da usare <text>:

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

O un approccio più curioso usando @:@:

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

È questo un cambiamento noto e documentato nel motore di visualizzazione Razor?

+1

L'avvertimento da ReSharper in questo caso non è corretto, e devono essere segnalati a loro o soppressi. C'è una differenza tra il codice C# generato in fase di progettazione e in runtime, il runtime C# esegue il wrapping del string.format con un'altra chiamata al metodo, e quindi è totalmente valido. Il resharper dovrebbe ignorare questa classe di errori (e così puoi) –

risposta

15

Sembra un insetto. Funziona con String:

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

Molto probabilmente perché 'String' non è una parola chiave. Comunque, un comportamento un po 'strano, non sono sicuro del motivo per cui dovrebbe consentire '@' all'interno dei blocchi di codice per cominciare. –

+0

@ deve essere consentito perché è C# valido; è usato per dichiarare stringhe letterali; vale a dire. stringhe in cui i caratteri speciali sono riprodotti esattamente. Quindi, 'string msg =" test \ t messaggio ";' sostituisce '\ t' con una scheda, ma' string msg = @ "test \ t messaggio"; 'lo lascia come' "\ t" '. – anaximander

+0

@ non deve essere consentito e non è in rasoio. @ prima che un identificatore venga utilizzato per sovrascrivere le parole chiave con i nomi dei tipi. –

5

questo è davvero un bug abbiamo deciso di non risolvere, si noti che la sintassi non è corretta in quanto non v'è alcuna transizione tra C# e marcatura in questo caso.

Capisco che il resharper mostri un avvertimento qui, ma credo che l'avviso sia sbagliato.

Ecco il bug per riferimento futuro https://aspnetwebstack.codeplex.com/workitem/458

+0

Il resharper mostra un avviso, ma il runtime lancia l'avviso come eccezione. – rfcdejong

+0

Un altro riferimento: https://github.com/aspnet/Razor/issues/64 – GSerg