Який найкращий спосіб створити HTML в коді C #? [зачинено]


15

Я вважаю, що розмітка повинна залишатися в розмітці, а не в коді позаду.

Я потрапив у ситуацію, коли я вважаю прийнятним побудувати HTML у коді позаду. Я хотів би досягти консенсусу щодо того, якими найкращими практиками є чи мають бути.

Коли допустимо будувати HTML в коді позаду? Який найкращий метод створити цей html? (наприклад: Strings, StringBuilder, HTMLWriter тощо)


спробуйте скористатися шаблонами та заповнювачами, куди ви будете плювати цю розмітку HTML.
Юсубов

5
Інший варіант: створити XML на основі вашої моделі даних, а потім використовувати XSLT для перетворення XML у HTML.
FrustratedWithFormsDesigner

Щойно я помітив сьогодні C # / XAML для HTML5, виглядає перспективно і може відповідати вашому сценарію. cshtml5.com
softveda

проблема з маршрутом XSLT полягає в локалізації. Якщо вам потрібні дві мови, вам потрібні два таблиці стилів XSLT і підтримувати їх паралельно. Це пекло. Краще просто запишіть HTML у текстовий файл із C #. використовувати String.Format та $ ".. {змінну} ..." разом з WPFLocalization?
Ерік

Відповіді:


12

Чи тут не застосовується щось на зразок Razor ? Тому що якщо ви робите багато генерації html за допомогою переглядача, це може зробити це набагато простіше. Він також був побудований для використання поза ASP.NET.

Однак іноді це не те, що потрібно. Чи обдумали ви використовувати клас TagBuilder, який входить до .net (mvc)? Є також HtmlWriter в System.Web.UI (для веб-форм). Я б рекомендував один із них, якщо ви робите Controlsабо Html Helpers.


3
+1, якщо вам потрібно шаблонувати в бритві програми - це шлях. Ознайомтеся з razorengine @ nuget.org/packages/RazorEngine, якщо вам потрібен чудовий варіант для монтажу бритви в додатку non-asp.net.
Wyatt Barnett

1
У мене є аналогічна вимога, коли мені потрібно генерувати html (його навантаження) в бібліотеці класів. Я хочу використовувати для цього бритву, але намагаюся зрозуміти, як підтримувати файли cshtml у dll. Як він може поєднуватися разом?
Яшвіт

Ви можете просто перейти в будь-який рядок stackoverflow.com/questions/3628895/…
Даніель Літтл

14

Я б використовував пакет Html Agility для збирання HTML, а потім виписував його у текстовий файл.

Багато годин працювало на те, щоб зробити Html Agility Pack надійним та HTML-сумісним HTML.

Я думаю, що він включає навіть зразок програми, яка генерує HTML.

З домашньої сторінки:

Зразки додатків:

Виправлення чи генерація сторінки. Ви можете виправити сторінку так, як вам захочеться, змінити DOM, додати вузли, копіювати вузли, ну ... ви це назвете.


5

Я б використовував htmltags для створення HTML.

Приклад:

var tag = new HtmlTag("span")
    .Text("Hello & Goodbye")
    .AddClass("important")
    .Attr("title", "Greetings")

А потім CSQuery, якщо я хочу розібрати HTML

Приклад:

dom.Select("div > span")
    .Eq(1)
    .Text("Change the text content of the 2nd span child of each div");

2

Звичайно, там є бібліотеки, такі як HTML Agility Pack, який може допомогти вам у цих починаннях.

Якщо ви дійсно не хочете використовувати існуючу бібліотеку і хочете простий, брудний код, мені подобається ідея абстрагувати деякі поведінки, як у попередній відповіді. Мені також подобається ідея використання базового StringBuilder, на відміну від рядка з кількох причин:

  1. Струни менш ефективні, ніж рядкові
  2. StringBuilder - структура даних, що підлягає індексуванню,

Якщо мені не потрібен масово розроблений HTML-движок, я б створив простий, інтуїтивно зрозумілий інтерфейс

AddLineBreak();
AddSimpleTag(string tagName);
AddSimpleTagAt(string tagName, string content, int index);
Output();

1
Индексируемая структура даних є переконливим, але я б не став турбуватися занадто багато про ефективність: codinghorror.com/blog/2009/01 / ...
Jim G.

1
Я декілька разів потрапляв на важкість струнних, особливо ДУЖЕ великі струнні. StringBuilders ефективніше пам'яті та ефективнішими процесорами, коли вони отримують великі розміри. Отже, у такій реалізації, де HTML може стати дійсно великим, я б почав із StringBuilder. Якби була гарантія, що HTML не стане дуже великим, рядок, безумовно, був би достатнім.
Тім C

1
Добре, якщо HTML може бути дійсно великим, я, безумовно, порекомендував би пакет Agility. [Я насправді рекомендував пакет HTML Agility за дві хвилини до цього. :)]
Джим Г.

1

Якщо ви все-таки використовуєте лише рядки, не забудьте уникнути всіх зарезервованих символів HTML у вихідних даних.

&    &
>    >
<    &lt;
"    &quot;
'    &apos;

Я рекомендую використовувати клас або бібліотеку, що знає HTML, а не працювати безпосередньо з рядками. HTMLWriter виглядає досить непогано.


Дякую за це розуміння. Для тих, хто це може читати, саме це я використовую для передачі значень таблиці даних у шаблоні елемента. Ключ (як пропонує Майк Кларк) повинен знати HTML: <asp: Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "сервер" Text = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise" (& apos; {0} & apos; {1} & apos; {2} '); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking "))% > '/>
real_yggdrasil

-1

Майже два роки після початкової посади - ось рішення, яке добре спрацювало для мене. У цільовому документі я розміщую наступне:

<table>    
    <%:theHtmlTableMomToldYouAbout() %>    //# Where I want my rows of table data to go
</table>

викликана функція виглядає приблизно так:

    public HtmlString theHtmlTableMomToldYouAbout()
    {
        string content = "";
        HtmlString theEnvelopePlease = null;

        for (int i = 0; i < 5; i++)
        {
            content = content + "<tr><td>The Number Is: " + i + "</td></tr>";
        }
        theEnvelopePlease = new HtmlString(content);
        return theEnvelopePlease;      
    }

І отриманий результат у браузері очікується:
Число: 0
Число: 1
Число: 2
Число: 3
Число: 4

Коли я переходжу до перегляду джерела, виявляю наступне:

<table>
    <tr><td>The Number Is: 0</td></tr>
    <tr><td>The Number Is: 1</td></tr>
    <tr><td>The Number Is: 2</td></tr>
    <tr><td>The Number Is: 3</td></tr>
    <tr><td>The Number Is: 4</td></tr>
</table>

1
Я зазначу, що у вашому рішенні є багато тих самих проблем, у яких "вміст" є незмінним рядком, як ті, що описані в низьких очках до цього питання.

-1

ПОЛЕ ВКЛЮЧЕНО!

var html = "";
html += "<table class='colorful'>";
foreach(var item in collection) {
     html += "<tr>";
     html += "<td class='boldCell'>" + item.PropWhatever + "</td>";
     // more cells here as needed
     html += "</tr>";
}
html += "</table>";
placeholder1.InnerHtml = html;

Я буду намагатися отримати це рішення, але, як колишній дизайнер, якому довелося налаштовувати HTML в коді, перш ніж я дійсно знав багато про .NET, вищезгаданий код було набагато простіше зрозуміти, ніж методи, які створюють абстрактні HTML. Якщо ви думаєте, що дизайнерові доведеться коли-небудь виправити ваш HTML, використовуйте прості рядки, як це.

Щось, я бачу, багато пропусків пропускають, коли вони пишуть HTML в коді, - це те, що в HTML, для атрибутів допускаються одинарні або подвійні лапки. Тож замість того, щоб уникати всіх цитат у коді (який виглядає неправдоподібним, як пекло неініційованим), просто використовуйте одинарні цитати для html цитат у ваших рядках.


ТОЧО. Все, що ви змусили стрибати ненависників, - це мій реп. Ось "правильний" спосіб зробити це без з'єднання рядків, але я притримуюсь своєї думки, що будь-яка звичайна сторінка з нормальними таблицями не буде мати жодних проблем із продуктивністю поза деяким смішним масштабом, схожим на Google:

var sb = new System.Text.StringBuilder();
sb.Append("<table class='colorful'>");
foreach (var item in collection)
{
     sb.Append("<tr>");
     sb.Append("<td class='boldCell'>" + item.PropWhatever + "</td>");
     // more cells here as needed
     sb.Append("</tr>");
}
sb.Append("</table>");
placeholder1.InnerHtml = sb.ToString();

3
-1 використання + для об'єднання рядків у циклі - це найгірше, що можна зробити.
Даніель Літтл


Ну, а для початку використання +=внутрішнього циклу таким чином зовсім не масштабується; оскільки рядки незмінні, ви створюєте абсолютно новий рядок щоразу, коли це робите. Використовуйте StringBuilderзамість цього.
Роберт Харві

3
Чому люди, які пишуть жахливий код, діляться своїм жахливим кодом з іншими людьми.
Рамхаунд

3
@Ramhound Про що If you think a designer might ever have to tweak your HTML, use simple strings like this.важко зрозуміти? Деякі народи визначають жахливий код, який купує мілісекунди продуктивності ціною, що займає багато секунд, щоб повністю зрозуміти. Очевидно, коли ви очікуєте, що ваш код перегляне або підтримує найнижчий загальний знаменник окремої особи, випадок, безумовно, може зробити так, що написання коду, який легше зрозуміти чи налаштувати, завжди краще, ніж найчистіший або найкраще виконаний код.
maple_shaft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.