2010-11-28 9 views
14

में सामग्री को प्रस्तुत करने के लिए कैसे Razor में एक चर में HTML का एक टुकड़ा प्रस्तुत करने के लिए?रेजर - एक चर

<content var="t"> 
    <a class="tab" href="">Tab name</a> 
</content> 

<content var="tc"> 
    <div class="tabcontent"> 
     <p>Here goes tab content</p> 
    </div> 
</content> 

!{tabs(t, tc)} 

दो चर मैक्रो टैब पत्रक में सामग्री के सभी अच्छा रैपिंग करता है के लिए पारित हो: स्पार्क में मैं निम्नलिखित कोड लिखने के लिए इस्तेमाल किया।

रेजर में ऐसा करने का सबसे अच्छा तरीका क्या है?

अद्यतन: मुझे लगता है कि मुझे मिल गया ..

उस्तरा में, @<text>...</text> निर्माण जो एचटीएमएल का एक टुकड़ा बताए की एक विस्तारित बराबर है, लैम्ब्डा भाव, जो बाद में पुन: उपयोग किया जा सकता है निर्माण करने के लिए उपयोगकर्ता हो सकता है एक चर के लिए। ऊपर के उदाहरण निम्नलिखित तरीके से लागू किया जा सकता:

Func<int, object> t = 
    @<text> 
     <a class="tab" href="">Tab name</a> 
    </text>; 

Func<int, object> tc = 
    @<text> 
     <div class="tabcontent"> 
      <p>Here goes tab content</p> 
     </div> 
    </text>; 


@tabs(t(0), tc(0)) 

मैं बस को समझ नहीं सकता कैसे parameterless lambdas (Func<object>) लिखने के लिए। उपरोक्त दोनों भेड़ के बच्चे में int पैरामीटर एक डमी है। रेजर को एक पैरामीटर की आवश्यकता होती है (और अभिव्यक्ति के भीतर इसे इंगित करने के लिए पहले से ही एक चर "आइटम" बनाता है)।

उत्तर

5

शायद आप HtmlString का उपयोग कर सकते हैं? मुझे लगता है मैं इस बहुत पसंद नहीं लगता है, लेकिन यहाँ है कि मैं क्या तुम्हारे पास क्या है की एक सटीक अनुवाद के रूप में की कोशिश करेंगे ...

@{ 
    var t = new HtmlString("<a class='tab' href=''>Tab name</a>"); 
    var tc = new HtmlString("<div class='tabcontent'><p>Here goes tab content</p></div>"); 
} 
@tabs(t, tc) 

तो ... मैं नहीं जानता कि अपने स्पार्क मैक्रो कैसा दिखता है , लेकिन यह रेजर में एक सहायक का उपयोग करने का अवसर लगता है।

@helper Tabs(string tabName, string tabContent) 
{ 
    <!-- some wrapper code --> 
    <a class="tab" href="">@(tabName)</a> 
    <!-- some more wrapper code --> 
    <div class="tabcontent"> 
     <p>@(tabContent)</p> 
    </div> 
    <!-- still more wrapper code --> 
} 

तो फिर तुम फोन कि इतने की तरह अपने पेज में से:

@Tabs("Tab Name", "Here goes tab content") 
+0

धन्यवाद, मुझे लगता है कि मैं वास्तव में जरूरत है एक इनलाइन सहायक वाक्य रचना है। मैं यह नहीं करता कि यह अभी तक रेजर में उपलब्ध है। समाधान एक स्पष्ट सहायक घोषित करना होगा, जिसे कहा जा सकता है और परिणाम एक चर में असाइन किया जा सकता है। – Andy

+0

मैं उपरोक्त टिप्पणी में गलत था। वाक्यविन्यास उपलब्ध है, कोई स्पष्ट सहायक की आवश्यकता नहीं है। इसके बजाय लैम्ब्डा अभिव्यक्तियों का उपयोग किया जा सकता है। मेरा अद्यतन प्रश्न देखें। – Andy

5

शायद ज़रुरत पड़े किसी और को इस पद पाता है (मैंने किया था के रूप में), एंडी अद्यतन लगभग वहाँ है आप की तरह कुछ हो सकता है । दिए गए उदाहरण के अलावा, आपको दिए गए उदाहरण में 'int' तक पहुंचने के लिए केवल @item संदर्भ देना है। @<text></text> ब्लॉक में, परिवर्तनीय item में वह मॉडल शामिल है जिसे इसे कॉल किया गया था।

@model PageData 

@{ 
    Func<Customer, object> sayHi = 
     @<text> 
      <li>Hello @(item.FirstName)!</li> 
     </text>; 
} 

<ul> 
    @foreach(var customer in Model.Customers) 
    { 
     sayHi(customer); 
    } 
</ul> 

ज्यादातर मामलों में आप शायद इस तरह एक समारोह के बजाय एक आंशिक दृश्य का उपयोग करना चाहिए:

यह इस प्रकार से इस्तेमाल किया जा सकता का एक उदाहरण है। लेकिन दुर्लभ उदाहरणों में कि आंशिक दृश्य संभव नहीं है (जैसे कि रेजोरइंजिन लाइब्रेरी का उपयोग करते समय), यह काम करता है।, ऑपरेटर सिर्फ remmebr के लिए:

@{ 
    Func<dynamic, object> a = @<text> 
     Some Text   
    </text>; 
    @a(new object()) 
}  

पाठ एक पंक्ति के लिए है, तो केवल तुम भी इस्तेमाल कर सकते हैं "@:"

+0

आपने इस तथ्य को इंगित किया कि प्रसिद्ध नहीं, धन्यवाद! – Sel

7

मूल रूप से ओ पी पहले से ही आप की तरह कुछ कर सकता है कि में समस्या जवाब अर्धविराम (या अगर यह किसी भी समापन कोष्ठक या कोष्ठक की जरूरत है), अगली पंक्ति पर निम्न उदाहरण में:

@{ 
    Func<dynamic, object> a = @: Some Text 
    ;  
    @a(new object()) 
} 

हालांकि आप इसे सीधे एक स्ट्रिंग के रूप पर कब्जा कर सकते हैं अगर आप चाहते हैं

@{ 
    string a = ((Func<dynamic, object>)(@<text> 
        Some Text 
       </text>))("").ToString(); 
    @a //Output directly as a string   
} 

तुम भी एक समारोह में यह संपुटित सकता है:

@functions{ 
    public string ToString(Func<dynamic, object> input) 
    { 
      return input("").ToString(); 
    } 
} 

@{ 
    string a = ToString(@<text> 
        Some Text 
       </text>); 
    @a //Output directly as a string   
} 
0

यदि आप अपने उस्तरा ध्यान में रखते हुए एक IHtmlContentBuilder है, तो आप इन एक्सटेंशन का उपयोग कर सकते हैं।

public static IHtmlContentBuilder AppendRazor(this IHtmlContentBuilder htmlContentBuilder, Func<IHtmlContent, dynamic> lamda) 
    { 
     var html = lamda(null); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

    public static IHtmlContentBuilder AppendRazor<T>(this IHtmlContentBuilder htmlContentBuilder, Func<T, IHtmlContent> lamda, T model) 
    { 
     var html = lamda(model); 
     return htmlContentBuilder.AppendHtml(html); 
    } 

प्रयोग

@{ 
    HtmlContentBuilder contentBuilder = new HtmlContentBuilder(); 
    contentBuilder.AppendRazor(@<text><p>Hello @Model.Name<p></text>); 
    contentBuilder.AppendRazor(@<text><p>Hello @item.CustomerName<p></text>, customer); 
} 
<div> 
    @contentBuilder 
</div>