2013-03-21 9 views
14

最近、私のWebサイトをASP.NET MVC3(Razor)からMVC4(Razor2)にアップグレードしました。 Razorビューエンジン"@:@"で修正できるMVC4 Razorの破損の可能性があります

シナリオ(大幅に簡略化)を以下に示します。

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

これは誤差でstring.Formatライン結果がMVC4/Razor2で、MVC3 /カミソリで正常に動作します:

は、 "@" 文字の後に予期しない "文字列" のキーワード。コードの中に入れば、 "string"のような構造体の前に "@"を付ける必要はありません。

@を削除すると、ビューエンジンはstring.Format行をセミコロンで終了することを要求します。しかし、ReSharperは次のように警告します。(正しく):

純粋な方法の戻り値は使用されません。

私はこのために見つけた2つの修正が<text>を使用するか、次のとおりです。

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

または@:@を使用して、より好奇心のアプローチ:

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

が、これは知られており、文書の変更ですRazorビューエンジンでは?

+1

警告が間違っている、と彼らに報告したり抑制しなければなりません。 デザイン時および実行時に生成されたC#コードには違いがあります。ランタイムC#はstring.formatを別のメソッド呼び出しでラップするため、完全に有効です。 Resharperはこのクラスのエラーを無視しなければなりません。 –

答えて

15

バグのようです。それはStringで動作します:

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

'String'はキーワードではないためです。とにかく少し奇妙な振る舞いで、なぜコードブロックの内側で '@ 'が始まるのか分かりません。有効なC#であるため@ –

+0

@を許可する必要があります。それは逐語的な文字列を宣言するために使用されます。すなわち、特殊文字が正確に再現された文字列。だから、 'string msg =" test \ t message ";' '\ t'をタブで置き換えますが、' string msg = @ "test \ t message"; '' \ t "'として残します。 – anaximander

+0

@は許可する必要はなく、Razorにはありません。 @識別子がタイプ名でキーワードを上書きする前に使用されます。 –

5

これは確かに私たちは、修正この場合はC#とマークアップの間に遷移が存在しないような構文が間違っていることに注意しないことを決定したバグです。

私はresharperがここに警告を表示することを理解しますが、私は警告が間違っていると思います。ここで

はバグが今後の参考のためである。この場合、ReSharperのから https://aspnetwebstack.codeplex.com/workitem/458

+0

Resharperは警告を表示しますが、ランタイムによって例外として警告がスローされます。 – rfcdejong

+0

別の参照:https://github.com/aspnet/Razor/issues/64 – GSerg

関連する問題