41

Вопрос по c#, html – Написать HTML в C #

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

и это будет работать, но нужно заменить все & quot; с & quot; & quot;

  • Error: User Rate Limit Exceededgist.github.com/sergkr/13d57dca75b385f0a359

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededHtmlTextWriter.

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceedednew XElement("div", new XAttribute("class", "container"))Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededcodeproject.com/KB/dotnet/mailtemplates.aspx

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededen.wikipedia.org/wiki/Template_engine_(web)

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededEnvironment.NewLineError: User Rate Limit Exceeded

    от
  • Хорошо, что вы изменили его версию, это плохой способ создания html-файла с помощью программы.

    от Kredns
  • зачем использовать{0} совсем? За исключением названия, оно вам не нужно. Вы можете просто указать свою строку в качестве первого аргумента и не использовать второй аргумент.

    от Joel Coehoorn
  • Error: User Rate Limit Exceeded

    от
  • дубликат:stackoverflow.com/questions/937201 stackoverflow.com/questions/897226 stackoverflow.com/questions/340095 stackoverflow.com/questions/346449

    от Mauricio Scheffer
17 ответов
  • 5

    Code:

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

  • 23

    Когда я решаю эту проблему на других языках

    я делаю код и HTML. Что-то вроде:

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

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

  • 6

    Вы могли бы использовать

    System.Xml.Linq объекты. Они были полностью переделаны из старогоSystem.Xml дни, которые делали создание XML с нуля действительно раздражающим.

    Кроме doctype, я думаю, вы могли бы легко сделать что-то вроде:

    var html = new XElement("html",
        new XElement("head",
            new XElement("title", "My Page")
        ),
        new XElement("body",
            "this is some text"
        )
    );
    

  • 0

    Я написал эти классы

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

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

  • 5

    Ты можешь использовать 

    Ты можешь использоватьT4 Templates для создания HTML (или любой) из вашего кода. видеть это:http://msdn.microsoft.com/en-us/library/ee844259.aspx

  • 80

    Возможно, вам лучше использовать

    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

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

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

  • 0

    Вы можете написать свои собственные классы с его методом Render и друг

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

    С уважением

  • 2

    Если вы хотите создать документ HTML

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

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

  • 1

    С введением 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> 
    

    Для полного образца см.Вот

  • 10

    Используйте

    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.Creat,e(@"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>
    

  • 3

    Самый простой способ - использовать объект XmlWriter. Это может быть и

    спользовано для создания корректного HTML и позаботится обо всех неприятных escape-последовательностях для вас.

    http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx

  • 13

    Я знаю

    что вы спрашивали о C #, но если вы хотите использовать любой язык .Net, тогда я настоятельно рекомендую Visual Basic для этой конкретной проблемы. В Visual Basic есть функция XML Literal, которая позволит вам писать такой код.

    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.

  • 2

    Вы можете использовать некоторые сторонние библиотеки с открытым исход

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

    Update Например

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

  • 0

    Это действительно зависит от того

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

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

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

    ASP.NET Web Controls ASP.NET primitives and HTML controls XmlWriter and/or HtmlWriter If doing Silverlight development with HTML interoperability, consider something strongly typed like link text StringBuilder and other super primitives

  • 1

    Это не общее решение

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

  • 0

    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>