C # कोड में HTML बनाने का सबसे अच्छा तरीका क्या है? [बन्द है]


15

मेरी यह धारणा है कि मार्कअप मार्क-अप में रहना चाहिए, न कि पीछे के कोड में।

मैं ऐसी स्थिति में आया हूं जहां मुझे लगता है कि पीछे के कोड में HTML का निर्माण करना स्वीकार्य है। मैं कुछ सर्वसम्मति रखना चाहता हूं कि सबसे अच्छे तरीके क्या हैं या होने चाहिए।

कोड के पीछे html बनाने के लिए कब स्वीकार्य है? इस html को बनाने के लिए सबसे अच्छा तरीका क्या है? (उदाहरण: स्ट्रिंग्स, स्ट्रिंगबर्स्ट, एचटीएमएलट्राइटर, आदि)


उन टेम्पलेट और प्लेसहोल्डर्स का उपयोग करने का प्रयास करें जहां आप इस html मार्क-अप को थूकेंगे।
यूसुबोव

5
एक अन्य विकल्प: अपने डेटा मॉडल के आधार पर XML का उत्पादन करें और फिर XML को HTML में बदलने के लिए XSLT का उपयोग करें।
FrustratedWithFormsDesigner

बस HTML5 के लिए आज ही C # / XAML मेरे ध्यान में आया, आशाजनक देखो और अपने परिदृश्य के अनुरूप हो सकता है। cshtml5.com
softveda

XSLT मार्ग के साथ एक समस्या स्थानीयकरण में है। यदि आपको दो भाषाओं की आवश्यकता है, तो आपको दो XSLT स्टाइलशीट की आवश्यकता है और उन्हें समानांतर रखें। वह नरक है। बेहतर बस सी # से एक पाठ फ़ाइल के लिए HTML लिखें। String.Format और $ ".. {वैरिएबल} ..." का उपयोग WPFLocalization के साथ मिलकर करें?
एरिक

जवाबों:


12

क्या रेज़र जैसी कोई चीज़ यहाँ पर लागू नहीं है? क्योंकि यदि आप एक दृश्य इंजन का उपयोग करके बहुत सी HTML पीढ़ी कर रहे हैं तो यह बहुत आसान बना सकता है। इसे ASP.NET के बाहर उपयोग करने के लिए भी बनाया गया था।

हालाँकि कभी-कभी आपकी ज़रूरत नहीं होती है। क्या आपने TagBuilder वर्ग का उपयोग करने पर विचार किया है जो .net (mvc) का हिस्सा है? System.Web.UI में (वेब ​​प्रपत्रों के लिए) HtmlWriter भी है । अगर आप बना रहे हैं Controlsया मैं इनमें से एक की सिफारिश करूंगा Html Helpers


3
+1, यदि आपको ऐप रेजर के भीतर टेम्प्लेटिंग की जरूरत है तो जाने का रास्ता है। यदि आप एक गैर- r.net.net एप्लिकेशन के भीतर बढ़ते रेजर के लिए एक बढ़िया विकल्प की आवश्यकता है, तो razorengine @ nuget.org/packages/RazorEngine देखें ।
व्याट बार्नेट

1
मुझे एक समान आवश्यकता है जहां मुझे एक कक्षा पुस्तकालय में html (इसके भार) उत्पन्न करने की आवश्यकता है। मैं इसके लिए रेजर का उपयोग करना चाहता हूं, लेकिन यह समझने के लिए संघर्ष करना है कि एक dll में cshtml फ़ाइलों को कैसे बनाए रखा जाए। यह एक साथ बंडल कैसे कर सकता है?
यशवित

आप बस किसी भी स्ट्रिंग स्टैटोरओवरफ्लो
डैनियल लिटिल

14

मैं HTML को इकट्ठा करने के लिए Html Agility Pack का उपयोग करूंगा और फिर इसे एक टेक्स्ट फ़ाइल में लिखूंगा।

एचटीएमएल एगिलिटी पैक को मजबूत बनाने और एचटीएमएल-अनुरूप HTML-अनुकूल बनाने में बहुत सारे मानव-घंटे गए ।

मुझे लगता है कि इसमें एक नमूना अनुप्रयोग भी शामिल है जो HTML उत्पन्न करता है।

मुख पृष्ठ से:

नमूना आवेदन:

पेज फिक्सिंग या जनरेशन। आप जिस पेज को चाहें, उसे ठीक कर सकते हैं, DOM को संशोधित कर सकते हैं, नोड्स जोड़ सकते हैं, नोड्स कॉपी कर सकते हैं, ठीक है ... आप इसे नाम दें।


5

मैं HTML बनाने के लिए htmltags का उपयोग करता हूँ

उदाहरण:

var tag = new HtmlTag("span")
    .Text("Hello & Goodbye")
    .AddClass("important")
    .Attr("title", "Greetings")

और फिर CSQuery अगर मैं HTML पार्स करना चाहता हूँ

उदाहरण:

dom.Select("div > span")
    .Eq(1)
    .Text("Change the text content of the 2nd span child of each div");

2

बेशक, वहाँ बाहर पुस्तकालय हैं, जैसे कि HTML चपलता पैक जो इन प्रयासों में आपकी सहायता कर सकते हैं।

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

  1. स्ट्रिंग बिल्डर की तुलना में स्ट्रिंग्स कम कुशल हैं
  2. StringBuilder एक इंडेक्सेबल डेटा संरचना है,

अगर मुझे बड़े पैमाने पर इंजीनियर HTML इंजन की आवश्यकता नहीं है, तो मैं एक सरल, सहज ज्ञान युक्त इंटरफ़ेस बनाऊंगा

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();

1
इंडेक्सेबल डेटा संरचना सम्मोहक है, लेकिन मैं दक्षता के बारे में बहुत अधिक चिंता नहीं करूंगा
.

1
मैंने स्ट्रिंग्स के भारीपन पर कुछ समय दिया है, खासकर बड़ी स्ट्रिंग्स। StringBuilders अधिक स्मृति कुशल और प्रोसेसर कुशल हैं जब वे बड़े हो जाते हैं। तो, इस तरह से एक कार्यान्वयन में, जहां HTML वास्तव में बड़ा हो सकता है, मैं एक स्ट्रिंगबर्ल के साथ शुरू करूंगा। अगर इस बात की गारंटी थी कि HTML बहुत बड़ी नहीं होने वाली है, तो निश्चित रूप से एक स्ट्रिंग पर्याप्त होगी।
टिम सी

1
खैर अगर HTML वास्तव में बड़ा हो सकता है, तो मैं निश्चित रूप से HTML चपलता पैक की सिफारिश करूंगा। [मैंने वास्तव में HTML चपलता पैक की सिफारिश दो मिनट पहले की थी। :)]
जिम जी।

1

यदि आप केवल स्ट्रिंग्स का उपयोग कर समाप्त करते हैं, तो अपने आउटपुट डेटा में सभी HTML आरक्षित वर्णों से बचना न भूलें।

&    &
>    >
<    &lt;
"    &quot;
'    &apos;

मैं सीधे स्ट्रिंग के साथ काम करने के बजाय एक HTML-जागरूक वर्ग या लाइब्रेरी का उपयोग करने की सलाह देता हूं, हालांकि HTMLWriter बहुत अच्छी शुरुआत की तरह दिखता है।


इस अंतर्दृष्टि के लिए धन्यवाद। जो कोई भी इसे पढ़ सकता है, यह वही है जो मैं एक आइटम टेम्पलेट में एक datatable के मूल्यों को पारित करने के लिए उपयोग करता हूं। कुंजी है (जैसा कि माइक क्लार्क सुझाव देते हैं) एचटीएमएल के बारे में जागरूक होना: <asp: बटन आईडी = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" पाठ = "Wijnigig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise) ((apos; {0} & apos; & apos; {1} & apos; & apos; & 2; apos; {2} & apos ;;?), Eval ("Cursus"), Eval ("Omsfrijving"), Eval ("Opmerking"))% > '/>
real_yggdrasil

-1

मूल पद के लगभग दो साल बाद - यहाँ एक समाधान है जिसने मेरे लिए अच्छा काम किया है। लक्ष्य दस्तावेज़ में मैं निम्नलिखित स्थान पर हूँ:

<table>    
    <%:theHtmlTableMomToldYouAbout() %>    //# Where I want my rows of table data to go
</table>

कहा जा रहा फ़ंक्शन इस तरह दिखता है:

    public HtmlString theHtmlTableMomToldYouAbout()
    {
        string content = "";
        HtmlString theEnvelopePlease = null;

        for (int i = 0; i < 5; i++)
        {
            content = content + "<tr><td>The Number Is: " + i + "</td></tr>";
        }
        theEnvelopePlease = new HtmlString(content);
        return theEnvelopePlease;      
    }

और ब्राउज़र में परिणामी आउटपुट अपेक्षित है:
नंबर है: 0
नंबर है: 1
नंबर है: 2
नंबर है: 3
नंबर है: 4

जब मैं स्रोत देखने जाता हूं तो मुझे निम्नलिखित मिलते हैं:

<table>
    <tr><td>The Number Is: 0</td></tr>
    <tr><td>The Number Is: 1</td></tr>
    <tr><td>The Number Is: 2</td></tr>
    <tr><td>The Number Is: 3</td></tr>
    <tr><td>The Number Is: 4</td></tr>
</table>

1
मैं आपको बताऊंगा कि आपके समाधान में 'कंटेंट' के समान ही कई मुद्दे हैं जो एक अपरिवर्तनीय स्ट्रिंग हैं क्योंकि इस प्रश्न के लिए कम स्कोरिंग पोस्ट में वर्णित हैं।

-1

लौ जल रही!

var html = "";
html += "<table class='colorful'>";
foreach(var item in collection) {
     html += "<tr>";
     html += "<td class='boldCell'>" + item.PropWhatever + "</td>";
     // more cells here as needed
     html += "</tr>";
}
html += "</table>";
placeholder1.InnerHtml = html;

मैं इसके लिए नीचा दिखाऊंगा, लेकिन एक पूर्व डिजाइनर के रूप में, जिसे HTML में कोड को ट्विट करना था, इससे पहले कि मैं वास्तव में .NET के बारे में बहुत कुछ जानता था, उपरोक्त कोड उन तरीकों की तुलना में समझने में आसान था जो HTML निर्माण करते हैं। यदि आपको लगता है कि एक डिजाइनर को कभी भी अपने HTML को ट्विस्ट करना पड़ सकता है, तो इस तरह से साधारण स्ट्रिंग्स का उपयोग करें।

जब मैं HTML को कोड में लिखता हूं तो बहुत सारे देवों की याद आती है कि HTML में, विशेषताओं के लिए एकल या दोहरे उद्धरण चिह्नों की अनुमति है। इसलिए कोड के सभी उद्धरणों से भागने के बजाय (जो गैर-आरंभ करने के लिए नरक के रूप में भद्दा दिखता है), बस अपने उद्धरणों के अंदर html उद्धरणों के लिए एकल उद्धरणों का उपयोग करें।


ठीक। आप सभी घृणास्पद स्ट्रिंग क्रैम्पिन मेरे प्रतिनिधि हैं। यहां स्ट्रिंग कॉन्सेप्टेशन के बिना ऐसा करने का 'उचित' तरीका है, लेकिन मैं अपनी राय से कहता हूं कि सामान्य तालिकाओं वाला कोई भी सामान्य पृष्ठ कुछ हास्यास्पद Google-जैसे स्केल के बाहर कोई भी प्रदर्शन समस्या पेश नहीं करेगा:

var sb = new System.Text.StringBuilder();
sb.Append("<table class='colorful'>");
foreach (var item in collection)
{
     sb.Append("<tr>");
     sb.Append("<td class='boldCell'>" + item.PropWhatever + "</td>");
     // more cells here as needed
     sb.Append("</tr>");
}
sb.Append("</table>");
placeholder1.InnerHtml = sb.ToString();

3
-1 का उपयोग + छोरों में तार को जोड़ने के लिए सबसे खराब चीज है जो आप कर सकते हैं।
डैनियल लिटिल


अच्छी तरह से, शुरुआत के लिए, +=एक लूप के अंदर इस तरह से उपयोग करना बिल्कुल भी पैमाना नहीं है; क्योंकि तार अपरिवर्तनीय हैं, आप हर बार ऐसा करते समय एक नया स्ट्रिंग बनाते हैं। StringBuilderइसके बजाय प्रयोग करें ।
रॉबर्ट हार्वे

3
भयानक कोड लिखने वाले लोगों को अन्य लोगों के साथ अपना भयानक कोड क्यों साझा करना चाहिए।
रामहाउंड

3
@ रामदूत क्या If you think a designer might ever have to tweak your HTML, use simple strings like this.समझना मुश्किल है? भयानक कोड की कुछ लोगों की परिभाषा वह है जो पूरी तरह से समझने के लिए कई सेकंड लेने की कीमत पर प्रदर्शन के मिलीसेकंड खरीदता है। स्पष्ट रूप से जब आप अपने कोड को किसी व्यक्ति के निम्नतम सामान्य भाजक द्वारा देखे जाने या बनाए रखने का अनुमान लगाते हैं, तो निश्चित रूप से यह मामला बनाया जा सकता है कि लेखन कोड जो समझना या ट्वीक करना आसान है, वह हमेशा सबसे साफ या सबसे अच्छा प्रदर्शन करने वाले कोड से बेहतर है।
maple_shaft
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.