Cách tốt nhất để tạo HTML trong mã C # là gì? [đóng cửa]


15

Tôi có niềm tin rằng đánh dấu nên duy trì ở trạng thái đánh dấu và không nằm trong mã phía sau.

Tôi đã đi đến một tình huống mà tôi nghĩ việc xây dựng HTML theo mã phía sau là chấp nhận được. Tôi muốn có một số sự đồng thuận về những gì các thực tiễn tốt nhất nên hoặc nên được.

Khi nào được chấp nhận để xây dựng html trong mã phía sau? Phương pháp tốt nhất để tạo html này là gì? (ví dụ: Chuỗi, StringBuilder, HTMLWriter, v.v.)


hãy thử sử dụng các mẫu và trình giữ chỗ nơi bạn sẽ nhổ cái đánh dấu html này.
Yusubov

5
Một tùy chọn khác: tạo XML dựa trên mô hình dữ liệu của bạn và sau đó sử dụng XSLT để biến XML thành HTML.
Thất vọngWithFormsDesigner

Chỉ cần đến thông báo của tôi hôm nay C # / XAML cho HTML5, có vẻ đầy hứa hẹn và có thể phù hợp với kịch bản của bạn. cshtml5.com
softveda

một vấn đề với tuyến XSLT nằm ở nội địa hóa. Nếu bạn cần hai ngôn ngữ, bạn cần hai bảng định kiểu XSLT và giữ chúng song song. Đó là địa ngục. Tốt hơn là chỉ viết HTML vào một tệp văn bản từ C #. sử dụng String.Format và $ ".. {biến} ..." cùng với WPFLocalization?
Erik

Câu trả lời:


12

Là sử dụng một cái gì đó như dao cạo không áp dụng ở đây? Bởi vì nếu bạn đang thực hiện nhiều thế hệ html bằng cách sử dụng công cụ xem có thể làm cho nó dễ dàng hơn nhiều. Nó cũng được xây dựng để sử dụng bên ngoài ASP.NET.

Tuy nhiên đôi khi đó không phải là những gì bạn cần. Bạn đã xem xét sử dụng lớp TagBuilder là một phần của .net (mvc) chưa? Ngoài ra còn có HtmlWriter trong System.Web.UI (dành cho các mẫu web). Tôi muốn giới thiệu một trong những thứ này nếu bạn đang làm Controlshoặc Html Helpers.


3
+1, nếu bạn cần tạo khuôn mẫu trong dao cạo ứng dụng là cách tốt nhất. Hãy xem razorengine @ nuget.org/packages/RazorEngine nếu bạn cần một tùy chọn tuyệt vời để gắn dao cạo trong ứng dụng non-asp.net.
Wyatt Barnett

1
Tôi có một yêu cầu tương tự khi tôi cần tạo html (tải nó) trong thư viện lớp. Tôi muốn sử dụng dao cạo cho việc này nhưng đấu tranh để hiểu cách duy trì các tệp cshtml trong một dll. Làm thế nào nó có thể bó lại với nhau?
Yashvit

Bạn chỉ có thể vượt qua trong bất kỳ chuỗi stackoverflow.com/questions/3628895/ từ
Daniel Little

14

Tôi sẽ sử dụng Gói Agility Html để tập hợp HTML và sau đó viết nó ra tệp văn bản.

Rất nhiều giờ đã đi vào để làm cho Gói Agility Agml mạnh mẽ và thân thiện với HTML tương thích với HTML.

Tôi nghĩ rằng nó thậm chí bao gồm một ứng dụng mẫu tạo HTML.

Từ trang chủ:

Ứng dụng mẫu:

Sửa lỗi trang hoặc tạo. Bạn có thể sửa một trang theo cách bạn muốn, sửa đổi DOM, thêm các nút, sao chép các nút, ... bạn đặt tên cho nó.


5

Tôi sẽ sử dụng htmltags để tạo HTML.

Thí dụ:

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

Và sau đó là CSQuery nếu tôi muốn phân tích HTML

Thí dụ:

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

2

Tất nhiên, có những thư viện ngoài kia, chẳng hạn như Gói Agility HTML có thể hỗ trợ bạn trong những nỗ lực này.

Nếu bạn thực sự không muốn sử dụng một thư viện hiện có và muốn mã đơn giản, bẩn thỉu, tôi thích ý tưởng trừu tượng hóa một số hành vi như câu trả lời trước đó đã nêu. Tôi cũng thích ý tưởng sử dụng StringBuilder bên dưới, trái ngược với chuỗi vì một vài lý do:

  1. Chuỗi kém hiệu quả hơn trình tạo chuỗi
  2. StringBuilder là một cấu trúc dữ liệu có thể lập chỉ mục,

Nếu tôi không cần một công cụ HTML được thiết kế ồ ạt, tôi sẽ xây dựng một giao diện đơn giản, trực quan

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

1
Cấu trúc dữ liệu có thể lập chỉ mục rất hấp dẫn, nhưng tôi sẽ không lo lắng quá nhiều về hiệu quả: mã hóa kinh dị.com / blog / 2009/01 / Giả
Jim G.

1
Tôi đã nhận được một vài lần về độ nặng của Chuỗi, đặc biệt là THỰC SỰ chuỗi lớn. StringBuilders là bộ nhớ hiệu quả hơn và hiệu quả xử lý khi chúng lớn. Vì vậy, trong một triển khai như thế này, nơi HTML có thể trở nên thực sự lớn, tôi sẽ bắt đầu với StringBuilder. Nếu có một đảm bảo rằng HTML sẽ không trở nên quá lớn, một chuỗi chắc chắn sẽ đầy đủ.
Tim C

1
Chà, nếu HTML có thể trở nên thực sự lớn, thì tôi chắc chắn sẽ khuyên dùng Gói Agility HTML. [Tôi thực sự đã đề xuất Gói Agility HTML hai phút trước khi bạn làm. :)]
Jim G.

1

Nếu bạn cuối cùng chỉ sử dụng các chuỗi, đừng quên thoát tất cả các ký tự dành riêng HTML trong dữ liệu đầu ra của bạn.

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

Tuy nhiên, tôi khuyên bạn nên sử dụng một lớp hoặc thư viện nhận biết HTML thay vì làm việc trực tiếp với các chuỗi. HTMLWriter có vẻ như là một khởi đầu khá tốt.


Cảm ơn bạn cho cái nhìn sâu sắc này. Đối với bất cứ ai điều này có thể đọc, đây là những gì tôi sử dụng để vượt qua các giá trị của một dữ liệu trong một mẫu vật phẩm. Chìa khóa là (như Mike Clark gợi ý) để nhận biết HTML: <asp: Nút ID = "btnEdit" CssClass = "btnmaatwerksmall" runat = "server" Text = "Wijzig" OnClientClick = '<% # String.Format ("OpenChildInIn (& apos; {0} & apos ;, & apos; {1} & apos ;, & apos; {2} & apos;); ", Eval (" Cursus "), Eval (" Omschrijving "), Eval (" Opmerking ") > '/>
real_yggdrasil

-1

Gần hai năm sau bài viết gốc - đây là một giải pháp đã làm việc tốt cho tôi. Trong tài liệu đích tôi đặt như sau:

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

Hàm được gọi trông như thế này:

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

Và kết quả đầu ra trong trình duyệt đúng như mong đợi:
Số là: 0
Số là: 1
Số là: 2
Số là: 3
Số là: 4

Khi tôi đi xem nguồn tôi tìm thấy như sau:

<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
Tôi sẽ chỉ ra rằng giải pháp của bạn có nhiều vấn đề tương tự với 'nội dung' là một chuỗi bất biến như những gì được mô tả trong các bài viết có điểm thấp cho câu hỏi này.

-1

NGỌN LƯA TRÊN!

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;

Tôi sẽ thăm dò ý kiến ​​này, nhưng là một nhà thiết kế trước đây đã phải chỉnh sửa mã HTML trước khi tôi thực sự biết nhiều về .NET, đoạn mã trên dễ hiểu hơn các phương pháp tạo HTML trừu tượng. Nếu bạn nghĩ rằng một nhà thiết kế có thể phải chỉnh HTML của bạn, hãy sử dụng các chuỗi đơn giản như thế này.

Một cái gì đó tôi thấy rất nhiều nhà phát triển bỏ lỡ khi họ viết HTML bằng mã là trong HTML, dấu ngoặc đơn hoặc dấu ngoặc kép được phép cho các thuộc tính. Vì vậy, thay vì thoát tất cả các dấu ngoặc kép trong mã (trông có vẻ như là địa ngục đối với người không bắt đầu), chỉ cần sử dụng dấu ngoặc đơn cho dấu ngoặc kép bên trong chuỗi của bạn.


KHỎE. Tất cả những người ghét bạn nối dây đều là người đại diện của tôi. Đây là cách 'phù hợp' để thực hiện việc này mà không cần nối chuỗi, nhưng tôi cho rằng bất kỳ trang bình thường nào có bảng bình thường sẽ không có bất kỳ vấn đề nào về hiệu suất bên ngoài quy mô giống như 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 sử dụng + để nối các chuỗi trong các vòng lặp là điều tồi tệ nhất bạn có thể làm.
Daniel Little


Chà, đối với người mới bắt đầu, sử dụng +=bên trong một vòng lặp theo cách này hoàn toàn không có quy mô; bởi vì chuỗi là bất biến, bạn đang tạo một chuỗi hoàn toàn mới mỗi khi bạn thực hiện nó. Sử dụng StringBuilderthay thế.
Robert Harvey

3
Tại sao những người viết mã khủng khiếp phải chia sẻ mã khủng khiếp của họ với người khác.
Ramhound

3
@Ramhound Điều gì If you think a designer might ever have to tweak your HTML, use simple strings like this.là khó hiểu? Một số định nghĩa của người dân về mã khủng khiếp là một trong số đó mua một phần nghìn giây hiệu suất với chi phí mất nhiều giây để hiểu đầy đủ. Rõ ràng khi bạn dự đoán mã của bạn được xem hoặc duy trì bởi mẫu số chung thấp nhất của cá nhân, trường hợp chắc chắn có thể được thực hiện rằng mã viết dễ hiểu hơn hoặc tinh chỉnh luôn tốt hơn mã sạch nhất hoặc hiệu suất tốt nhất.
maple_shaft
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.