c# - एएसपी.नेट 5 एमवीसी 6 में टैगबिल्डर इनरएचएमएम




asp.net-mvc asp.net-core (4)

मुझे ऐसा लगता है कि टाटाब्युल्डर में बीटा 7 के रूप में बड़ा तोड़ने वाले परिवर्तन हैं, जिनकी घोषणा रेपो में उनके बारे में नहीं है।

विशेष रूप से .टॉस्ट्रिंग अब टैग निर्माता को प्रतिपादित नहीं करता है, यह केवल प्रकार का नाम देता है। पहले हम इस तरह से हमारे एचटीएमएल हेल्पर एक्सटेंशन के अंदर नेस्टेड एचटीएमएल तत्वों का निर्माण कर सकते थे:

var li = new TagBuilder("li");
li.AddCssClass("inactive");
var span = new TagBuilder("span");
span.SetInnerText(somestring);
li.InnerHtml = span.ToString();

InnerHtml अब स्ट्रिंग स्वीकार नहीं करता है क्योंकि यह अब IHtmlContent है

लेकिन चूंकि .स्ट्रेस्टिंग () टैग को रेंडर नहीं करता है जो यह काम नहीं करता है:

li.InnerHtml = new HtmlString(span.ToString())

यह केवल "Microsoft.AspNet.Mvc.Rendering.TagBuilder" के रूप में प्रस्तुत करता है, प्रकार का नाम।

आवश्यक कार्यक्षमता प्रदान करने के लिए मुझे टैग्बिल्डर पर कोई नया तरीका नहीं दिखाई देता है मैं क्या खो रहा हूँ? मैं अब TagBuilder के साथ जटिल नेस्टेड HTML कैसे बना सकता हूं?


क्योंकि TagBuilder अब TagBuilder लागू IHtmlContent , तो आप इसे बिना सीधे उपयोग करने में सक्षम होना चाहिए। .ToString()

var li = new TagBuilder("li");
li.AddCssClass("inactive");
var span = new TagBuilder("span");
span.SetInnerText(somestring);
li.InnerHtml = span;

बीटा 7 में वर्तमान कार्यान्वयन की वास्तविक समस्या यह है कि माता-पिता के लिए दो बच्चे टैग निर्माता सामग्री को जोड़ने का कोई आसान तरीका नहीं है आप GitHub पर चर्चा का अनुसरण कर सकते हैं

वर्तमान प्रस्ताव InnerHtml को असाइन करने InnerHtml नहीं है, लेकिन समर्थन को इसके बजाय Append । यह बीटा 8 में कार्यान्वित होने का लक्ष्य है

बीटा 7 में काम करने वाले को parent.WriteTo को कॉल करना है। इसे string बदलने के लिए string parent.WriteTo साथ StringWriter


बीटा 8 ने Append() को टैग करने के लिए एक Append() विधि जोड़कर इस समस्या का समाधान किया।

बीटा 7 के लिए समाधान का उपयोग करने के लिए BufferedHtmlContent() वर्ग होगा, लेकिन क्योंकि यह पहुंच नहीं है हमें कुछ अतिरिक्त कार्य करना चाहिए

private class MyBufferedHtmlContent : IHtmlContent
{
    internal List<IHtmlContent> Entries { get; } = new List<IHtmlContent>();

    public MyBufferedHtmlContent Append(IHtmlContent htmlContent)
    {
        Entries.Add(htmlContent);
        return this;
    }

    public void WriteTo(TextWriter writer, IHtmlEncoder encoder)
    {
        foreach (var entry in Entries)
        {
            entry.WriteTo(writer, encoder);
        }
    }
}

उपयोग:

TagBuilder firstChild = new TagBuilder("input");
firstChild.MergeAttribute("type", "hidden");
firstChild.MergeAttribute("name", "Ids");
firstChild.TagRenderMode = TagRenderMode.SelfClosing;

TagBuilder secondChild = new TagBuilder("input");
secondChild.MergeAttribute("type", "hidden");
secondChild.MergeAttribute("name", "Ids");
secondChild.TagRenderMode = TagRenderMode.SelfClosing;

var innerHtml = new MyBufferedHtmlContent();
innerHtml.Append(firstChild);
innerHtml.Append(secondChild);
TagBuilder parent = new TagBuilder("div");
parent.InnerHtml = innerHtml;

लेखन के समय, एमवीसी 6 का उपयोग, Tagbuiler.InnerHtml वास्तव में अब कोई सेटर नहीं है। तत्व को जोड़ने के बजाय इसमें कुछ विधियां हैं उदाहरण के लिए आप लिख सकते हैं:

var container = new TagBuilder("div");
var input = new TagBuilder("input");

container.InnerHtml.AppendHtml(input);

StringWriter दृष्टिकोण के लिए वास्तविक कोड दिखाने के लिए @ मिहाई के उत्तर पर बिल्डिंग:

// Create tag builder
var builder = new TagBuilder("img");
//...
// Render tag approach also changed in .NetCore
builder.TagRenderMode = TagRenderMode.SelfClosing;

//Create the StringWriter and make TagBuilder "WriteTo" it
var stringWriter = new System.IO.StringWriter();
builder.WriteTo(stringWriter, HtmlEncoder.Default);
var tagBuilderIsFinallyAStringNow = stringWriter.ToString();




asp.net-core-mvc