C # kodunda HTML oluşturmanın en iyi yolu nedir? [kapalı]


15

İşaretlemenin kodlamada değil, işaretlemede kalması gerektiğine inanıyorum.

Ben arkasında kod HTML oluşturmak için kabul edilebilir olduğunu düşünüyorum bir duruma geldim. En iyi uygulamaların ne olduğu veya olması gerektiği konusunda fikir birliğine varmak istiyorum.

Ne zaman arkasında kod html oluşturmak kabul edilebilir? Bu HTML'yi oluşturmanın en iyi yöntemi nedir? (örnek: Dizeler, StringBuilder, HTMLWriter, vb.)


bu html işaretlemelerini tüküreceğiniz şablonları ve yer tutucuları kullanmayı deneyin.
Yusubov

5
Başka bir seçenek: veri modelinize göre XML üretin ve ardından XML'i HTML'ye dönüştürmek için XSLT'yi kullanın.
SinirliWithFormsDesigner

Bugün HTML5 için C # / XAML geldi, umut verici görünüyorsun ve senaryonuza uygun olabilir. cshtml5.com
softveda

XSLT yolu ile ilgili bir sorun yerelleştirmedir. İki dile ihtiyacınız varsa, iki XSLT stil sayfasına ihtiyacınız vardır ve bunları paralel tutun. Bu çok cehennem. Daha iyisi, C # 'dan bir metin dosyasına HTML yazmak. WPFLocalization ile birlikte String.Format ve $ ".. {variable} ..." kullanılsın mı?
Erik

Yanıtlar:


12

Jilet gibi bir şey kullanmak burada geçerli değil mi? Çünkü bir görünüm motoru kullanarak çok sayıda html üretimi yapıyorsanız bunu daha kolay hale getirebilirsiniz. Ayrıca ASP.NET dışında kullanılmak üzere üretilmiştir.

Ancak bazen ihtiyacınız olan şey bu değildir. .Net (mvc) 'nin bir parçası olan TagBuilder sınıfını kullanmayı düşündünüz mü ? System.Web.UI'de (web formları için) HtmlWriter da vardır . Yapıyorsanız bunlardan birini tavsiye ederim Controlsveya Html Helpers.


3
+1, bir uygulama jilet içinde templating gerekiyorsa gitmek için yoldur. Jilet olmayan bir uygulama içinde traş makinesi montajı için mükemmel bir seçeneğe ihtiyacınız varsa , razorengine @ nuget.org/packages/RazorEngine adresine göz atın .
Wyatt Barnett

1
Sınıf kütüphanesinde html (bunun yükleri) oluşturmak için gereken benzer bir gereksinim var. Bunun için jilet kullanmak istiyorum ama nasıl bir dll cshtml dosyaları korumak için anlamak için mücadele. Birlikte nasıl toplanabilir?
Yashvit

Herhangi bir dizeyi geçebilirsiniz stackoverflow.com/questions/3628895/…
Daniel Little

14

HTML oluşturmak ve sonra bir metin dosyasına yazmak için Html Agility Pack kullanır.

Html Agility Pack'i sağlam ve HTML uyumlu HTML dostu hale getirmek için birçok çalışma saati geçti .

Hatta HTML üreten örnek bir uygulama içerdiğini düşünüyorum.

Ana sayfadan:

Örnek uygulamalar:

Sayfa sabitleme veya oluşturma. Bir sayfayı istediğiniz gibi düzeltebilir, DOM'u değiştirebilir, düğüm ekleyebilir, düğüm kopyalayabilir, iyi ... adını verebilirsiniz.


5

HTML oluşturmak için htmltags kullanırdım.

Misal:

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

Ve sonra HTML ayrıştırmak istiyorsanız CSQuery

Misal:

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

2

Tabii ki, bu çabalarda size yardımcı olabilecek HTML Çeviklik Paketi gibi kütüphaneler var.

Gerçekten mevcut bir kütüphaneyi kullanmak istemiyorsanız ve basit, aşağı ve kirli bir kod istiyorsanız, daha önce belirtilen bir yanıt gibi bazı davranışları soyutlama fikrini seviyorum. Ayrıca birkaç nedenden dolayı bir dize aksine, temel bir StringBuilder kullanma fikrini seviyorum:

  1. Dizeler, dize oluşturucudan daha az verimlidir
  2. StringBuilder dizinlenebilir bir veri yapısıdır,

Eğer büyük ölçüde tasarlanmış bir HTML motoruna ihtiyacım yoksa, basit ve sezgisel bir arayüz oluşturabilirim

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

1
Dizine eklenebilir veri yapısı zorlayıcı, ama endişe olmaz çok verimlilik hakkında çok: codinghorror.com/blog/2009/01/...
Jim G.

1
Ben dizeleri, özellikle GERÇEKTEN büyük dizeleri ağırlık üzerinde birkaç kez aldım. StringBuilders büyüdüklerinde daha fazla bellek ve işlemci verimlidir. Yani, HTML'nin gerçekten büyük olabileceği böyle bir uygulamada, bir StringBuilder ile başlıyorum. HTML'nin çok büyük olmayacağına dair bir garanti olsaydı, bir dize kesinlikle yeterli olurdu.
Tim C

1
HTML gerçekten büyük olabilir, o zaman kesinlikle HTML Çeviklik Paketi tavsiye ederim. [Aslında sizden iki dakika önce HTML Çeviklik Paketi'ni önermiştim. :)]
Jim G.

1

Sonunda sadece dizeler kullanırsanız, çıkış verilerinizdeki tüm HTML ayrılmış karakterlerden kaçmayı unutmayın.

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

Bununla birlikte, doğrudan dizelerle çalışmak yerine HTML uyumlu bir sınıf veya kitaplık kullanmanızı öneririm. HTMLWriter oldukça iyi bir başlangıç ​​gibi görünüyor.


Bu içgörü için teşekkürler. Bu kim okuyabilir için, ben bir öğe şablonunda bir datatable değerleri geçirmek için kullandığım budur. Anahtar (Mike Clark'ın önerdiği gibi) HTML farkında olmaktır: <asp: Button ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "sunucu" Metin = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInEnterprise ('{0}', '{1}', '{2}'); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking "))% > '/>
real_yggdrasil

-1

Orijinal gönderiden yaklaşık iki yıl sonra - işte benim için iyi çalışan bir çözüm. Hedef belgeye aşağıdakileri yerleştiriyorum:

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

çağrılan işlev şöyle görünür:

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

Ve tarayıcıda ortaya çıkan çıktı beklendiği gibi:
Sayı: 0
Sayı: 1
Sayı: 2
Sayı: 3
Sayı: 4

Kaynağı görmeye gittiğimde aşağıdakileri buluyorum:

<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
Çözümünüzün, 'içerik'in bu sorunun düşük puanlama mesajlarında açıklananlarla değişmez bir dize olmasıyla aynı sorunların çoğuna sahip olduğunu belirteceğim.

-1

ALEV AÇIK!

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;

Bunun için probleme indirilecektim, ancak .NET hakkında çok şey bilmeden önce kodda HTML'yi değiştirmek zorunda kalan eski bir tasarımcı olarak, yukarıdaki kod, soyut HTML oluşturma yöntemlerinden daha kolay anlaşıldı. Bir tasarımcının HTML'nizi değiştirmek zorunda kalabileceğini düşünüyorsanız, bunun gibi basit dizeleri kullanın.

Kodda HTML yazarken devs özledim çok şey görüyorum şey HTML, tek veya çift tırnak nitelikleri için izin olmasıdır. Bu nedenle, koddaki tüm tırnak işaretlerinden kaçmak yerine (başlatılmayanlara cehennem gibi görünür), dizelerinizdeki html tırnakları için tek tırnak kullanın.


İNCE. Tüm dizeleri bitiştiren nefret edenler benim krampım. İşte dize birleştirme olmadan bunu yapmanın 'uygun' yolu, ancak normal tabloları olan herhangi bir normal sayfanın Google gibi bazı saçma ölçekler dışında herhangi bir performans sorunu göstermeyeceğini düşünüyorum:

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 döngülerdeki dizeleri birleştirmek için + ile yapabileceğiniz en kötü şeydir.
Daniel Little


Yeni başlayanlar için, +=bir döngü içinde bu şekilde kullanmak hiç ölçeklenmez; dizeler değişmez olduğundan, her yaptığınızda yepyeni bir dize oluşturuyorsunuz. StringBuilderBunun yerine bir kullanın.
Robert Harvey

3
Korkunç kod yazan insanlar neden korkunç kodlarını diğer insanlarla paylaşmalı?
Ramhound

3
@Ramhound Anlaşılması If you think a designer might ever have to tweak your HTML, use simple strings like this.zor olan nedir ? Bazı insanların korkunç kod tanımı, tam olarak anlaşılması uzun süreler pahasına milisaniye performans alan koddur. Kodunuzun bireyin en düşük ortak paydası tarafından görüntülenmesini veya sürdürülmesini beklediğinizde, durumun anlaşılması daha kolay veya ince ayar kodunun her zaman en temiz veya en iyi performans gösteren koddan daha iyi olduğu açıkça görülebilir.
maple_shaft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.