c# - Напишете HTML на низ

Translate

Имам код като този. Има ли начин да се улесни писането и поддържането? Използване на C # .NET 3.5.

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}", "");
}

Бих могъл и просто да напиша:

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"); 

Ще работи, но трябва да подменя всички"с"".

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

Всички отговори

lc.
Translate

Вероятно е по-добре да използватеHtmlTextWriterили anXMLWriterотколкото равнинаStringWriter. Те ще се погрижат да избягат вместо вас, както и да се уверят, че документът е добре оформен.

Тази страницапоказва основите на използването наHtmlTextWriterклас, същността на който е:

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();
източник
Translate

Когато се справя с този проблем на други езици, отивам за разделяне на кода и HTML. Нещо като:

1.) Създайте HTML шаблон. използване[varname]заместители за маркиране на заменено / вмъкнато съдържание.
2.) Попълнете променливите на вашия шаблон от масив или структура / картографиране / речник

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code
източник
Translate

Знам, че сте питали за C #, но ако желаете да използвате който и да е език .Net, горещо препоръчвам Visual Basic за точно този проблем. Visual Basic има функция, наречена XML Literals, която ще ви позволи да пишете код по този начин.

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

Това ви позволява да пишете прав HTML с дупки в изрази в стария ASP стил и прави кода ви супер четим. За съжаление тази функция не е в C #, но можете да напишете един модул във VB и да го добавите като препратка към вашия C # проект.

Писането в Visual Studio също позволява правилно отстъп за повечето XML литерали и цели изрази. Вдлъбнатината за дупките за израз е по-добра във VS2010.

източник
Translate

ИзползвайтеXDocumentза да създадете DOM, след това го запишете с помощта наXmlWriter. Това ще ви даде чудесно кратка и четлива нотация, както и добре форматиран изход.

Вземете тази примерна програма:

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);
        }
    }
}

Това генерира следния изход:

<!DOCTYPE html >
<html>
    <head />
    <body>
        <p>This paragraph contains <b>bold</b> text.</p>
        <p>This paragraph has just plain text.</p>
    </body>
</html>
източник
Translate

Можете да използватеSystem.Xml.Linqобекти. Те бяха напълно преработени от старитеSystem.Xmlдни, които направиха изграждането на XML от нулата наистина досадно.

Освен доктипа, предполагам, лесно бихте могли да направите нещо като:

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);
източник
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);
източник
Translate

Най-правният начин е да се използва обект XmlWriter. Това може да се използва за създаване на валиден HTML и ще се погрижи за всички гадни последователности за бягство за вас.

източник
Translate

Можеш да използвашT4 Шаблониза генериране на Html (или който и да е) от вашия код. виж това:http://msdn.microsoft.com/en-us/library/ee844259.aspx

източник
Translate

Ако искате да създадете HTML документ, подобен на начина, по който бихте създали XML документ в C #, можете да опитате библиотеката с отворен код на Microsoft,Html Agility Pack.

Той осигурява обект HtmlDocument, който има много подобен API наSystem.Xml.XmlDocumentклас.

източник
Translate

Можете да използвате ASP.NET, за да генерирате своя HTML извън контекста на уеб страниците.Ето една статиякоето показва как може да се направи.

източник
Translate

Бихте могли да използвате някои библиотеки с отворен код на трети страни, за да генерирате силен типизиран (X) HTML, като напримерCityLizard Frameworkили Sharp DOM.

АктуализиранеНапример

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"]]
            ]
        ]
    ];
източник
Translate

Това обаче не е общо решение, ако целта ви е да имате или поддържате шаблони за имейли, тогава System.Web има вграден клас, нареченMailDefinition. Този клас се използва от контролите за членство в ASP.NET за създаване на HTML имейли.

Същият вид „низ“ ли замества нещата, както е споменато по-горе, но пакетира всичко в MailMessage за вас.

Ето пример от MSDN:

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;
източник
Translate

С въвеждането на Razor в ASP.net MVC, най-добрият начин да пишете HTML в C # е с 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); 

Шаблон:

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

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

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

За пълна проба вижтетук

източник
Translate

Можете да напишете свои собствени класове с неговия метод Render и други атрибути, за да избегнете голяма бъркотия, ако го използвате много, а след това да използвате и HTMLWriter или xmlwriter. Тази логика се използва в страниците asp.net, можете да наследявате от webControl и да заменитеметод за рендиране, което е чудесно, ако разработвате контроли от страна на сървъра.
Товаможе да бъде добър пример.

за разбирането

източник
Translate

Наистина зависи за какво се стремите и по-конкретно какъв вид представление наистина трябва да предложите.

Виждал съм възхитителни решения за силно типизирана разработка на HTML (цялостни модели за управление, било то ASP.NET Web Controls или подобни на него), които просто добавят невероятна сложност към проект. В други ситуации е перфектно.

По ред на предпочитанията в света на C #,

  • ASP.NET уеб контроли
  • ASP.NET примитиви и HTML контроли
  • XmlWriter и / или HtmlWriter
  • Ако правите разработка на Silverlight с HTML оперативна съвместимост, помислете за нещо, което е силно написанотекст на връзката
  • StringBuilder и други супер примитиви
източник
Translate

Написах тези класове, които ми послужиха добре. Това е просто, но прагматично.

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;
    }
}
източник
MMA
Translate

HSharp е библиотека, използвана за лесно и бързо анализиране на езика за маркиране като HTML. Инсталирай: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);

и изход:

<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>
източник
Translate

Търсих нещо, което приличаше на jquery за генериране на dom в C # (не е необходимо да анализирам). За съжаление няма късмет в намирането на леко решение, затова създадох този прост клас, който е наследен от System.Xml.Linq.XElement. Ключовата характеристика е, че можете да веригирате оператора, както когато използвате jquery в javascript, така че да е по-плавен. Той не е напълно представен, но прави това, от което се нуждая, и ако има интерес, мога да започна git.

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;
    }
}

Пример:

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();
}

изход от горния код:

<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>
източник
Leave a Reply
You must be logged in to post a answer.
За автора