2011-01-24 12 views
28

मेरे पास मेरे वर्तमान प्रोजेक्ट में बहुत सी जटिल HTML रिपोर्टें हैं जहां हम पंक्तियों और कोल्स्पैन के साथ टीआर और टीडी के बहुत सशर्त प्रतिपादन करते हैं।रेजर व्यू इंजन: कॉम्प्लेक्स लूपिंग और एचटीएमएल

यह कभी कभी ऐसा दिखाई दे सकता है (यह अत्यंत सरलीकृत है):

<tr> 
@foreach (var ourItem in ourList) { 
    if (ourItem != ourList.First()) { 
     <tr>     
    } 
    <td></td> 
    </tr> 
} 

हालांकि, रेजर का दावा है:} "चरित्र" "foreach पाश एक बंद याद आ रही है"। (विजुअल स्टूडियो के अंदर) के

मैं <text></text> जो समापन} समस्या दूर ही जाना इस लगता है जब चलाने बनाता में <tr> रैप करने के लिए कोशिश की है:। "आई अंत टैग" tr "कोई मिलता-जुलता स्टार्ट टैग के साथ अपने शुरू कर रहे हैं/अंत टैग सही ढंग से संतुलित "।

मैं इस तरह की सशर्त प्रतिपादन कैसे करूं, जबकि रेजर को एचटीएमएल के बारे में परेशान न करें, क्योंकि सभी लूपिंग होने पर HTML संतुलित है। या कम से कम वह मामला था जब एएसपी.नेट व्यू इंजन का इस्तेमाल किया गया था।

+0

अपने कोड के दिखने से, पूरी स्थिति और/tr टुकड़ा उसी स्थिति में नहीं होना चाहिए।मैंने रेज़र का उपयोग नहीं किया है लेकिन जो आपने दिखाया है वह भ्रमित लगता है। यदि स्थिति पूरी नहीं होती है तो/tr टैग में शुरुआती टैग के रूप में पहली पंक्ति होती है और यदि स्थिति पूरी हो जाती है, तो उसके बाद दूसरे ट्र टैग के लिए और पहले के पास कोई संबंधित/tr टैग नहीं होता है। बस मैंने देखा कुछ। – shashi

+1

उपरोक्त कोड बेवकूफ हो सकता है, लेकिन यह मान्य है। जब भी एचटीएमएल में rendered। जिस बिंदु को मैं यहां साबित करने की कोशिश कर रहा हूं वह यह है कि भले ही प्रस्तुत परिणाम वैध HTML होगा, फिर भी रेजर इसमें आता है और इसे तोड़ देता है क्योंकि यह अजीब अर्थशास्त्र को स्वीकार नहीं कर सकता है, जो ऐसा लगता है कि यह उत्पन्न होगा। –

+0

@sassyboy अगर हमारी सूची खाली नहीं है तो हमेशा मिलान करने वाले trs होना चाहिए। ओपन टी सूची में पहले आइटम के लिए लूप के बाहर या बाद की वस्तुओं के लिए स्थिति के अंदर एक होगा। – Rup

उत्तर

35

विजुअल स्टूडियो इंटेलिजेंस और सिंटैक्स हाइलाइटिंग सबसे अच्छा नहीं है लेकिन इस मामले में यह आपको चेतावनी देता है कि यदि स्थिति संतुष्ट नहीं है, तो आपको अमान्य मार्कअप मिल सकता है और आपको इसके लिए दोष नहीं देना चाहिए।

महत्वपूर्ण बात यह है कि आपकी परियोजना ठीक चलती है लेकिन आप इस तर्क को एचटीएमएल हेल्पर्स में बाहरी करने पर विचार कर सकते हैं क्योंकि यदि आप जो कह रहे हैं वह सच है कि यह आपके विचारों में से एक सरल संस्करण है जो मैं नहीं चाहता कल्पना करें कि आपका वास्तविक कोड कैसा दिखता है।

आईएमएचओ को एक दृश्य में इतना सशर्त तर्क होने का दुरुपयोग है। आपको निश्चित रूप से HTML मददगार या नियंत्रण जैसे MVCContrib Grid का उपयोग करने पर विचार करना चाहिए।


अद्यतन:

आप निम्न हैक की कोशिश कर सकते हैं:

<tr> 
@foreach (var ourItem in ourList) { 
    if (ourItem != ourList.First()) { 
     @:<tr>     
    } 
    @:<td></td> 
    @:</tr> 
} 
+0

ओह, जब मैं इसे कैसिनी में चला रहा हूं तो मुझे वही त्रुटि मिलती है। असल में समस्या यह है कि रेजर एचएमटीएल के लिए जिम्मेदारी लेता है। मैं वास्तव में इसे बंद करना चाहता हूँ। –

+0

@ माइकएस्ट, देखें कि मेरा अपडेट समस्या को हल करता है या नहीं। –

+0

मैं आपसे सहमत हूं। एसपी 1 में उनके लिए कोई टैग ढहने वाला सुविधा नहीं है, हम सीटीआरएल एम + टी का उपयोग कर सकते हैं। कभी-कभी वे आपको त्रुटि दिखाते हैं, यहां तक ​​कि कोड ठीक काम करता है और कम से कम कोई समस्या नहीं है लेकिन वीएस सिंटैक्स गायब है। –

6

उस्तरा टैग मिलान कोड और मार्कअप के बीच स्वचालित संक्रमण निर्धारित करने के लिए पर निर्भर करता है। आप रेजर की इस सुविधा को "अक्षम" नहीं कर सकते (कम से कम रेजर पार्सर के बड़े हिस्सों को फिर से लिखने के बिना नहीं)।

आप डारिन के सुझाव का उपयोग करके इसके आसपास काम कर सकते हैं, हालांकि मुझे समझ में नहीं आता है (कम से कम आपके सरलीकृत उदाहरण से नहीं) क्यों आपके विचार को इतनी गड़बड़ की जरूरत है। क्यों बजाय निम्न कोड नहीं लिख: टैग उत्पन्न मार्कअप में बाहर संतुलन सकता

@foreach (var ourItem in ourList) { 
    <tr> 
    <td>...</td> 
    </tr> 
} 

है, स्रोत है कि आपके द्वारा दी गई यह बहुत इसकी सत्यता के बारे में कारण के लिए मुश्किल बना देता है।

4

जब रोस्पेन उपयोग करने के लिए कोशिश कर रहा है और इस तरह

<table> 
    <tr> 
     <td rowspan=2>1:st col</td> 
     <td>2:nd col</td> 
    </tr> 
    <tr> 
     <td>2:nd col</td> 
    </tr> 
</table> 

एक संरचना आप की कोशिश कर सकते प्राप्त करने की कोशिश:

@{ 
    var ourList = new List<string> { "1", "2", "3" }; 
} 

<table border=1> 
@foreach(var ourItem in ourList){ 
    <tr> 
    @if (ourItem == ourList.First()) 
    { 
     <td rowspan="@ourList.Count()">@ourItem</td> 
    } 
    <td>@ourItem</td> 
    </tr> 
} 
</table> 
4

मैं एक ऐसी ही समस्या थी - मेरी समाधान Html.Raw ("");

if (isTrue) 
    { 
     <text><div></text> } 
    ... 

    if(isTrue) { 
     @Html.Raw("</div>"); // <-- closing tag! 
     } 
संबंधित मुद्दे