2013-03-21 7 views
14

के साथ तय किया जा सकता है मैंने हाल ही में अपनी वेबसाइट को एएसपी.नेट एमवीसी 3 (रेजर) से एमवीसी 4 (रेजर 2) में अपग्रेड किया है, और ऐसा करने में ऐसा लगता है कि ब्रेकिंग बदलाव की तरह क्या लगता है रेजर व्यू इंजन।एमवीसी 4 रेजर में संभावित ब्रेकिंग चेंज जिसे "@: @"

परिदृश्य (बहुत सरलीकृत) नीचे दिखाया गया है।

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

यह MVC3/उस्तरा में ठीक काम करता है, फिर भी MVC4 में/Razor2 की एक त्रुटि में string.Format लाइन परिणाम: के बाद "@" चरित्र

अप्रत्याशित "स्ट्रिंग" कीवर्ड। एक बार कोड के अंदर, आपको "स्ट्रिंग" जैसे "स्ट्रिंग" जैसी संरचनाओं को उपसर्ग करने की आवश्यकता नहीं है।

आप @ निकालते हैं, तो दृश्य इंजन तो मांग है कि आप अर्धविराम string.Format लाइन को समाप्त। हालांकि, फिर रीशेर्पर चेतावनी देता है (ठीक है तो):

शुद्ध विधि का वापसी मूल्य उपयोग नहीं किया जाता है।

दो फिक्स मैं इस के लिए मिल गया है या तो <text> उपयोग करने के लिए कर रहे हैं:

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

या एक और अधिक उत्सुक दृष्टिकोण @:@ का उपयोग कर:

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

यह एक जाना जाता है और प्रलेखित परिवर्तन है रेजर व्यू इंजन में?

+1

इस मामले में ReSharper से चेतावनी गलत है के लिए बग है, और उन्हें करने के लिए सूचना या दबा दिया जाना चाहिए। डिज़ाइन समय और रनटाइम में उत्पन्न सी # कोड के बीच एक अंतर है, रनटाइम सी # स्ट्रिंग.फॉर्मैट को किसी अन्य विधि कॉल के साथ लपेट देगा, और इसलिए यह पूरी तरह मान्य है। Resharper त्रुटियों के इस वर्ग को अनदेखा करना चाहिए (और आप भी कर सकते हैं) –

उत्तर

15

एक बग की तरह लगता है। यह String साथ काम करता है:

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

सबसे अधिक संभावना है क्योंकि 'स्ट्रिंग' एक कीवर्ड नहीं है। वैसे भी थोड़ा अजीब व्यवहार, मुझे यकीन नहीं है कि यह कोड ब्लॉक के अंदर से शुरू होने के लिए '@' क्यों अनुमति देगा। –

+0

@ को अनुमति दी जानी चाहिए क्योंकि यह वैध सी # है; इसका उपयोग वर्बैटिम स्ट्रिंग्स घोषित करने के लिए किया जाता है; अर्थात। तार जिसमें विशेष पात्रों को वास्तव में पुन: उत्पन्न किया जाता है। तो, 'string msg = "test \ t message"; '' t t' को एक टैब के साथ बदलता है, लेकिन' string msg = @ "test \ t message"; 'इसे \" \ t "' के रूप में छोड़ देता है। – anaximander

+0

@ को अनुमति नहीं है, और रेजर में नहीं है। @ पहचानकर्ता से पहले टाइप नाम वाले कीवर्ड ओवरराइड करने के लिए उपयोग किया जाता है। –

5

यह वास्तव में एक बग हम, ठीक ध्यान दें कि वाक्य रचना सही नहीं है वहाँ के रूप में इस मामले में सी # और मार्कअप के बीच कोई संक्रमण है नहीं करने का फैसला है।

मैं समझता हूं कि रिशेर्पर यहां एक चेतावनी दिखाता है लेकिन मेरा मानना ​​है कि चेतावनी गलत है।

यहाँ भविष्य में संदर्भ के https://aspnetwebstack.codeplex.com/workitem/458

+0

रिशेर्पर एक चेतावनी दिखाता है, लेकिन रनटाइम चेतावनी को अपवाद के रूप में फेंकता है .. – rfcdejong

+0

एक अन्य संदर्भ: https://github.com/aspnet/Razor/issues/64 – GSerg

संबंधित मुद्दे