Написать HTML в C # - PullRequest
44 голосов
/ 17 июня 2009

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

-edit- я тогда не знал, но я мог написать

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

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

Ответы [ 17 ]

2 голосов
/ 17 июня 2009

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

1 голос
/ 12 декабря 2017

С введением Razor в ASP.net MVC лучшим способом написания HTML на C # является использование Razor Engine.

string templatePath = $@"{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> 

Полный образец см. здесь

1 голос
/ 17 июня 2009

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

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>
0 голосов
/ 26 ноября 2011

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

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;
    }
}
0 голосов
/ 17 июня 2009

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

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

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

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

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

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...