c# - Kirjoita HTML merkkijonoon

Translate

Minulla on tällainen koodi. Onko olemassa tapa helpottaa kirjoittamista ja ylläpitoa? C # .NET 3.5: n käyttö.

string header(string title)
{
    StringWriter s = new StringWriter();
    s.WriteLine("{0}","<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
    s.WriteLine("{0}", "<html>");
    s.WriteLine("<title>{0}</title>", title);
    s.WriteLine("{0}","<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">");
    s.WriteLine("{0}", "</head>");
    s.WriteLine("{0}", "<body>");
    s.WriteLine("{0}", "");
}

Voisin myös vain kirjoittaa:

s.WriteLine("{0}", @"blah blah

many
new
lines
blah UHY#$&_#$_*@Y KSDSD<>\t\t\t\t\t\tt\t\t\\\t\t\t\t\\\h\th'\h't\th
hi
done"); 

Se toimii, mutta minun on korvattava kaikki"kanssa"".

This question and all comments follow the "Attribution Required."

Kaikki vastaukset

lc.
Translate

Olet todennäköisesti parempi käyttääHtmlTextWritertai anXMLWriterkuin tavallinenStringWriter. He huolehtivat pakenemisesta puolestasi ja varmistavat, että asiakirja on hyvin muotoiltu.

Tämä sivunäyttää perustiedotHtmlTextWriterluokka, jonka ydin on:

StringWriter stringWriter = new StringWriter();

using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{
    writer.AddAttribute(HtmlTextWriterAttribute.Class, classValue);
    writer.RenderBeginTag(HtmlTextWriterTag.Div); // Begin #1

    writer.AddAttribute(HtmlTextWriterAttribute.Href, urlValue);
    writer.RenderBeginTag(HtmlTextWriterTag.A); // Begin #2

    writer.AddAttribute(HtmlTextWriterAttribute.Src, imageValue);
    writer.AddAttribute(HtmlTextWriterAttribute.Width, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Height, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Alt, "");

    writer.RenderBeginTag(HtmlTextWriterTag.Img); // Begin #3
    writer.RenderEndTag(); // End #3

    writer.Write(word);

    writer.RenderEndTag(); // End #2
    writer.RenderEndTag(); // End #1
}
// Return the result.
return stringWriter.ToString();
Lähde
Translate

Kun käsittelen tätä ongelmaa muilla kielillä, erotan koodin ja HTML: n. Vähän niin kuin:

1.) Luo HTML-malli. käyttää[varname]paikkamerkit korvatun / lisätyn sisällön merkitsemiseksi.
2.) Täytä mallimuuttujat taulukosta tai rakenteesta / kartoituksesta / sanakirjasta

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code
Lähde
Translate

Tiedän, että kysyit C #: sta, mutta jos olet valmis käyttämään mitä tahansa .Net-kieltä, suosittelen Visual Basicia juuri tähän ongelmaan. Visual Basicissa on ominaisuus nimeltä XML Literals, jonka avulla voit kirjoittaa tällaista koodia.

Module Module1

    Sub Main()

        Dim myTitle = "Hello HTML"
        Dim myHTML = <html>
                         <head>
                             <title><%= myTitle %></title>
                         </head>
                         <body>
                             <h1>Welcome</h1>
                             <table>
                                 <tr><th>ID</th><th>Name</th></tr>
                                 <tr><td>1</td><td>CouldBeAVariable</td></tr>
                             </table>
                         </body>
                     </html>

        Console.WriteLine(myHTML)
    End Sub

End Module

Tämän avulla voit kirjoittaa suoran HTML-koodin ilmaisureikillä vanhaan ASP-tyyliin ja tekee koodistasi erittäin luettavan. Valitettavasti tämä ominaisuus ei ole C #: ssä, mutta voit kirjoittaa yhden moduulin VB: hen ja lisätä sen viitteenä C # -projektiisi.

Kirjoittaminen Visual Studiossa mahdollistaa myös oikean sisennyksen useimmille XML-kirjastoille ja lausekkeiden kokonaisuuksille. Ilmentymisreikien sisennys on parempi mallissa VS2010.

Lähde
Translate

KäytäXDocumentluoda DOM, kirjoita se sitten käyttämälläXmlWriter. Tämä antaa sinulle ihanan ytimekkään ja luettavan merkinnän sekä kauniisti muotoillun tuloksen.

Ota tämä esimerkkiohjelma:

using System.Xml;
using System.Xml.Linq;

class Program {
    static void Main() {
        var xDocument = new XDocument(
            new XDocumentType("html", null, null, null),
            new XElement("html",
                new XElement("head"),
                new XElement("body",
                    new XElement("p",
                        "This paragraph contains ", new XElement("b", "bold"), " text."
                    ),
                    new XElement("p",
                        "This paragraph has just plain text."
                    )
                )
            )
        );

        var settings = new XmlWriterSettings {
            OmitXmlDeclaration = true, Indent = true, IndentChars = "\t"
        };
        using (var writer = XmlWriter.Create(@"C:\Users\wolf\Desktop\test.html", settings)) {
            xDocument.WriteTo(writer);
        }
    }
}

Tämä tuottaa seuraavan tuotoksen:

<!DOCTYPE html >
<html>
    <head />
    <body>
        <p>This paragraph contains <b>bold</b> text.</p>
        <p>This paragraph has just plain text.</p>
    </body>
</html>
Lähde
Translate

Voisit käyttääSystem.Xml.Linqesineitä. Ne suunniteltiin kokonaan vanhastaSystem.Xmlpäivät, jotka tekivät XML: n rakentamisen tyhjästä todella ärsyttäviksi.

Luulen, että doctypein lisäksi voit helposti tehdä jotain seuraavista:

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);
Lähde
Translate
return string.Format(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN""      ""http://www.w3.org/TR/html4/strict.dtd"">
<html>
<title>{0}</title>
<link rel=""stylesheet"" type=""text/css"" href=""style.css"">
</head>
<body>
", title);
Lähde
Translate

Selkein tapa on käyttää XmlWriter-objektia. Tätä voidaan käyttää kelvollisen HTML-koodin tuottamiseen ja se huolehtii kaikista ikävistä pakosarjoista.

Lähde
Translate

Voit käyttääT4-mallitHTML: n (tai minkä tahansa muun) luomiseen koodistasi. katso tämä:http://msdn.microsoft.com/en-us/library/ee844259.aspx

Lähde
Translate

Jos haluat luoda HTML-asiakirjan, joka on samanlainen kuin XML-asiakirja C #: ssä, voit kokeilla Microsoftin avoimen lähdekoodin kirjastoa,HTML-ketteryyspaketti.

Se tarjoaa HtmlDocument-objektin, jolla on hyvin samanlainen sovellusliittymä kuinSystem.Xml.XmlDocumentluokassa.

Lähde
Translate

ASP.NET: n avulla voit luoda HTML-koodisi verkkosivujen kontekstin ulkopuolelle.Tässä on artikkelijoka osoittaa kuinka se voidaan tehdä.

Lähde
Translate

Voit käyttää joitain kolmannen osapuolen avoimen lähdekoodin kirjastoja vahvan kirjoitetun (X) HTML-koodin luomiseen, kutenCityLizard Frameworktai Sharp DOM.

PäivittääEsimerkiksi

html
    [head
        [title["Title of the page"]]
        [meta_(
            content: "text/html;charset=UTF-8",
            http_equiv: "Content-Type")
        ]
        [link_(href: "css/style.css", rel: "stylesheet", type: "text/css")]
        [script_(type: "text/javascript", src: "/JavaScript/jquery-1.4.2.min.js")]
    ]
    [body
        [div
            [h1["Test Form to Test"]]
            [form_(action: "post", id: "Form1")
                [div
                    [label["Parameter"]]
                    [input_(type: "text", value: "Enter value")]
                    [input_(type: "submit", value: "Submit!")]
                ]
            ]
            [div
                [p["Textual description of the footer"]]
                [a_(href: "http://google.com/")
                    [span["You can find us here"]]
                ]
                [div["Another nested container"]]
            ]
        ]
    ];
Lähde
Translate

Tämä ei kuitenkaan ole yleinen ratkaisu, mutta jos oppilaalla on oltava tai ylläpitää sähköpostimalleja, System.Webissä on sisäänrakennettu luokka nimeltäMailDefinition. Tätä luokkaa käyttävät ASP.NET-jäsenohjaukset HTML-sähköpostien luomiseen.

Korvaa samanlainen merkkijono yllä mainitut asiat, mutta pakkaa kaikki sinulle MailMessageen.

Tässä on esimerkki MSDN: stä:

ListDictionary replacements = new ListDictionary();
replacements.Add("<%To%>",sourceTo.Text);
replacements.Add("<%From%>", md.From);
System.Net.Mail.MailMessage fileMsg;
fileMsg = md.CreateMailMessage(toAddresses, replacements, emailTemplate, this); 
return fileMsg;
Lähde
Translate

Kun Razor otettiin käyttöön ASP.net MVC: ssä, paras tapa kirjoittaa HTML C #: ksi on Razor Engine.

string templatePath = [email protected]"{Directory.GetCurrentDirectory()}\EmailTemplates"; 

IRazorLightEngine engine = EngineFactory.CreatePhysical(templatePath); 

var model = new Notification 
{ 
       Name = "Jone", 
       Title = "Test Email", 
       Content = "This is a test" 
}; 

string result = engine.Parse("template.cshtml", model); 

Sapluuna:

<h2>Dear @Model.Name, you have a notification.</h2> 

<h1>@Model.Title</h1> 
<p>@Model.Content</p> 

<p>Date:@DateTime.Now</p> 

Katso täydellinen näytetässä

Lähde
Translate

Voit kirjoittaa omat luokkasi sen Render-menetelmällä ja muilla attribuuteilla välttääksesi suurta sotkua, jos käytät sitä paljon, ja käytä sitten myös HTMLWriteria tai xmlwriteria. Tätä logiikkaa käytetään asp.net-sivuilla, voit periä webControlista ja ohittaarenderöintimenetelmä, mikä on hienoa, jos kehität palvelinpuolen ohjaimia.
Tämävoisi olla hyvä esimerkki.

Terveiset

Lähde
Translate

Se riippuu todella siitä, mihin olet menossa, ja erityisesti siitä, millaista esitystä todella tarvitset.

Olen nähnyt ihailtavia ratkaisuja vahvasti kirjoitettuun HTML-kehitykseen (täydelliset ohjausmallit, olkoon se sitten ASP.NET-verkko-ohjaimet tai vastaavia), jotka vain lisäävät hämmästyttävän monimutkaisen projektin. Muissa tilanteissa se on täydellinen.

C # -maailman ensisijaisuusjärjestyksessä

  • ASP.NET-verkko-ohjaimet
  • ASP.NET-primitiivit ja HTML-ohjaimet
  • XmlWriter ja / tai HtmlWriter
  • Jos teet Silverlight-kehitystä HTML-yhteensopivuuden kanssa, harkitse jotain voimakkaasti kirjoitettualinkkiteksti
  • StringBuilder ja muut super primitiivit
Lähde
Translate

Kirjoitin nämä luokat, jotka palvelivat minua hyvin. Se on yksinkertaista mutta käytännöllistä.

public class HtmlAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }

    public HtmlAttribute(string name) : this(name, null) { }

    public HtmlAttribute(
        string name,
        string @value)
    {
        this.Name = name;
        this.Value = @value;
    }

    public override string ToString()
    {
        if (string.IsNullOrEmpty(this.Value))
            return this.Name;

        if (this.Value.Contains('"'))
            return string.Format("{0}='{1}'", this.Name, this.Value);

        return string.Format("{0}=\"{1}\"", this.Name, this.Value);
    }
}

public class HtmlElement
{
    protected List<HtmlAttribute> Attributes { get; set; }
    protected List<object> Childs { get; set; }
    public string Name { get; set; }
    protected HtmlElement Parent { get; set; }

    public HtmlElement() : this(null) { }

    public HtmlElement(string name, params object[] childs)
    {
        this.Name = name;
        this.Attributes = new List<HtmlAttribute>();
        this.Childs = new List<object>();

        if (childs != null && childs.Length > 0)
        {
            foreach (var c in childs)
            {
                Add(c);
            }
        }
    }

    public void Add(object o)
    {
        var a = o as HtmlAttribute;
        if (a != null)
            this.Attributes.Add(a);
        else
        {
            var h = o as HtmlElement;
            if (h != null && !string.IsNullOrEmpty(this.Name))
            {
                h.Parent = this;
                this.Childs.Add(h);
            }
            else
                this.Childs.Add(o);
        }
    }

    public override string ToString()
    {
        var result = new StringBuilder();

        if (!string.IsNullOrEmpty(this.Name))
        {
            result.Append(string.Format("<{0}", this.Name));
            if (this.Attributes.Count > 0)
            {
                result.Append(" ");
                foreach (var attr in this.Attributes)
                {
                    result.Append(attr.ToString());
                    result.Append(" ");
                }

                result = new StringBuilder(result.ToString().TrimEnd(' '));
            }

            if (this.Childs.Count == 0)
            {
                result.Append(" />");
            }
            else
            {
                result.AppendLine(">");

                foreach (var c in this.Childs)
                {
                    var cParts = c.ToString().Split('\n');

                    foreach (var p in cParts)
                    {
                        result.AppendLine(string.Format("{0}", p));
                    }
                }

                result.Append(string.Format("</{0}>", this.Name));
            }
        }
        else
        {
            foreach (var c in this.Childs)
            {
                var cParts = c.ToString().Split('\n');

                foreach (var p in cParts)
                {
                    result.AppendLine(string.Format("{0}", p));
                }
            }
        }

        var head = GetHeading(this);

        var ps = result.ToString().Split('\n');
        return string.Join("\r\n", (from p in ps select head + p.TrimEnd('\r')).ToArray());
    }

    string GetHeading(HtmlElement h)
    {
        if (h.Parent != null)
            return "    ";
        else
            return string.Empty;
    }
}
Lähde
MMA
Translate

HSharp on kirjasto, jota käytetään analysoimaan merkintäkieli, kuten HTML, helposti ja nopeasti. Asentaa:PM> Install-Package Obisoft.HSharp

        var Document = new HDoc(DocumentOptions.BasicHTML);
        Document["html"]["body"].AddChild("div");
        Document["html"]["body"]["div"].AddChild("a", new HProp("href", "/#"));
        Document["html"]["body"]["div"].AddChild("table");
        Document["html"]["body"]["div"]["table"].AddChildren(
         new HTag("tr"),
         new HTag("tr", "SomeText"),
         new HTag("tr", new HTag("td")));
        var Result = Document.GenerateHTML();
        Console.WriteLine(Result);

ja lähtö:

<html>
<head>
<meta charset="utf-8"></meta><title>
Example </title>
</head>
<body>
<div>
<a href="/#"></a><table>
<tr></tr><tr>
SomeText </tr>
<tr>
<td></td></tr>
</table>
</div>
</body>
</html>
Lähde
Translate

Etsin jotain, joka näytti jqueryltä dom: n luomiseksi C #: ssä (minun ei tarvitse jäsentää). Valitettavasti ei onnea kevyen ratkaisun löytämisessä, joten loin tämän yksinkertaisen luokan, joka on peritty System.Xml.Linq.XElementiltä. Tärkein ominaisuus on, että voit ketjuttaa operaattorin kuten käyttäessäsi jqueryä javascriptissä, jotta se olisi sujuvampaa. Se ei ole täysin esillä, mutta se tekee mitä tarvitsen, ja jos on kiinnostusta, voin aloittaa kitkan.

public class DomElement : XElement
{
    public DomElement(string name) : base(name)
    {
    }

    public DomElement(string name, string value) : base(name, value)
    {
    }

    public DomElement Css(string style, string value)
    {
        style = style.Trim();
        value = value.Trim();
        var existingStyles = new Dictionary<string, string>();
        var xstyle = this.Attribute("style");
        if (xstyle != null)
        {
            foreach (var s in xstyle.Value.Split(';'))
            {
                var keyValue = s.Split(':');
                existingStyles.Add(keyValue[0], keyValue.Length < 2 ? null : keyValue[1]);
            }
        }

        if (existingStyles.ContainsKey(style))
        {
            existingStyles[style] = value;
        }
        else
        {
            existingStyles.Add(style, value);
        }

        var styleString = string.Join(";", existingStyles.Select(s => $"{s.Key}:{s.Value}"));
        this.SetAttributeValue("style", styleString);

        return this;
    }

    public DomElement AddClass(string cssClass)
    {
        var existingClasses = new List<string>();
        var xclass = this.Attribute("class");
        if (xclass != null)
        {
            existingClasses.AddRange(xclass.Value.Split());
        }

        var addNewClasses = cssClass.Split().Where(e => !existingClasses.Contains(e));
        existingClasses.AddRange(addNewClasses);

        this.SetAttributeValue("class", string.Join(" ", existingClasses));
        return this;
    }

    public DomElement Text(string text)
    {
        this.Value = text;
        return this;
    }

    public DomElement Append(string text)
    {
        this.Add(text);
        return this;
    }

    public DomElement Append(DomElement child)
    {
        this.Add(child);
        return this;
    }
}

Näyte:

void Main()
{
    var html = new DomElement("html")
        .Append(new DomElement("head"))
        .Append(new DomElement("body")
            .Append(new DomElement("p")
                .Append("This paragraph contains")
                .Append(new DomElement("b", "bold"))
                .Append(" text.")
                )
            .Append(new DomElement("p").Text("This paragraph has just plain text"))
            )
        ;

    html.ToString().Dump();

    var table = new DomElement("table").AddClass("table table-sm").AddClass("table-striped")
            .Append(new DomElement("thead")
                .Append(new DomElement("tr")
                    .Append(new DomElement("td").Css("padding-left", "15px").Css("color", "red").Css("color", "blue")
                        .AddClass("from-now")
                        .Append(new DomElement("div").Text("Hi there"))
                        .Append(new DomElement("div").Text("Hey there"))
                        .Append(new DomElement("div", "Yo there"))
                        )
                )
            )
        ;
    table.ToString().Dump();
}

ulostulo ylhäältä koodista:

<html>
  <head />
  <body>
    <p>This paragraph contains<b>bold</b> text.</p>
    <p>This paragraph has just plain text</p>
  </body>
</html>
<table class="table table-sm table-striped">
  <thead>
    <tr>
      <td style="padding-left:15px;color:blue" class="from-now">
        <div>Hi there</div>
        <div>Hey there</div>
        <div>Yo there</div>
      </td>
    </tr>
  </thead>
</table>
Lähde
Leave a Reply
You must be logged in to post a answer.
Kirjailijasta