Подтвердить что ты не робот

Написать HTML в строку

У меня есть такой код Есть ли способ облегчить написание и поддержку? Использование С#.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"); 

Это будет работать, но мне нужно заменить все " на "".

4b9b3361

Ответ 1

Возможно, вам лучше использовать HtmlTextWriter или XMLWriter, чем обычную 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();

Ответ 2

Когда я решаю эту проблему на других языках, я отправляюсь на разделение кода и HTML. Что-то вроде:

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

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code

Ответ 3

Я знаю, что вы спросили о С#, но если вы хотите использовать любой язык .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 и делает ваш код сверх читабельным. К сожалению, эта функция не в С#, но вы можете написать один модуль в VB и добавить его в качестве ссылки на ваш проект С#.

Запись в Visual Studio также позволяет создавать отступы для большинства литералов и литературных литератур. Отступы для отверстий для экспрессии лучше в VS2010.

Ответ 4

Используйте 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>

Ответ 5

Вы можете использовать объекты 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"
    )
);

Ответ 6

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

Ответ 7

Самый простой способ - использовать объект XmlWriter. Это может быть использовано для создания корректного HTML и позаботится обо всех неприятных escape-последовательностях для вас.

Ответ 9

Если вы хотите создать документ HTML, похожий на способ создания XML-документа на С#, вы можете попробовать библиотеку с открытым исходным кодом Microsoft, Html Agility Pack.

Он предоставляет объект HtmlDocument, который имеет очень похожий API для класса System.Xml.XmlDocument.

Ответ 10

Вы можете использовать ASP.NET для генерации HTML вне контекста веб-страниц. Вот статья, в которой показано, как это можно сделать.

Ответ 11

Вы можете использовать некоторые сторонние библиотеки с открытым исходным кодом для создания строго типизированного проверенного (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"]]
            ]
        ]
    ];

Ответ 12

Это не общее решение, однако, если ваш кандидат должен иметь или поддерживать шаблоны электронной почты, тогда 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;

Ответ 13

С введением Razor в ASP.net MVC лучший способ написать HTML на С# - с 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> 

Для полного примера см. здесь

Ответ 14

Вы можете написать свои собственные классы с помощью метода Render и других атрибутов, чтобы избежать большого беспорядка, если вы его много используете, а затем используйте HTMLWriter или xmlwriter. Эта логика используется на страницах asp.net, вы можете наследовать от webControl и переопределять метод , который отлично работает, если вы разрабатываете сервер -side управления.
Это может быть хорошим примером.

Привет

Ответ 15

На самом деле это зависит от того, что вы собираетесь делать, и конкретно, какую производительность вы действительно должны предлагать.

Я видел замечательные решения для строго типизированной разработки HTML (модели полного контроля, будь то ASP.NET Web Controls или аналогичные ей), которые просто добавляют удивительную сложность проекту. В других ситуациях это идеально.

В порядке предпочтения в мире С#,

  • Веб-элементы управления ASP.NET
  • примитивы ASP.NET и элементы управления HTML
  • XmlWriter и/или HtmlWriter
  • Если вы выполняете разработку Silverlight с использованием HTML-совместимости, рассмотрите что-то строго типизированное как текст ссылки
  • StringBuilder и другие супер примитивы

Ответ 16

Я написал эти классы, которые служили мне хорошо. Это просто, но прагматично.

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

Ответ 17

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>