2009-02-07 42 views
23

Html.Encode dường như chỉ cần gọi HttpUtility.HtmlEncode để thay thế một vài ký tự html cụ thể bằng chuỗi thoát của chúng.ASP.NET MVC Html.Encode - Dòng mới

Tuy nhiên, điều này không cung cấp bất kỳ xem xét nào về cách các dòng mới và nhiều khoảng trắng sẽ được diễn giải (khoảng trắng đánh dấu). Vì vậy, tôi cung cấp một vùng văn bản để người dùng nhập một khối văn bản thuần túy của thông tin, và sau đó hiển thị dữ liệu đó trên màn hình khác (sử dụng Html.Encode), các dòng và khoảng cách mới sẽ không được giữ nguyên.

Tôi nghĩ rằng có 2 tùy chọn, nhưng có thể có một người thứ ba tốt hơn có thể đề xuất.

Một lựa chọn sẽ được chỉ cần viết một phương pháp tĩnh mà sử dụng HtmlEncode, và sau đó thay thế dòng mới trong chuỗi kết quả với <br> và nhóm của nhiều không gian với &nbsp;

Một lựa chọn khác sẽ được mess về với white-space: pre thuộc tính trong phong cách của tôi - tuy nhiên tôi không chắc chắn nếu điều này sẽ tạo ra tác dụng phụ khi các phương pháp trợ giúp Html bao gồm các dòng mới và tabbing để làm cho nguồn trang khá.

Có tùy chọn thứ ba, như cờ toàn cầu, sự kiện hoặc phương pháp ghi đè tôi có thể sử dụng để thay đổi cách mã hóa html được thực hiện mà không cần phải làm lại các phương thức trợ giúp html?

Trả lời

23

HtmlEncode chỉ nhằm mã hóa các ký tự để hiển thị trong HTML. Nó đặc biệt không mã hóa các ký tự khoảng trống.

Tôi sẽ đi với tùy chọn đầu tiên của bạn và biến nó thành một phương pháp mở rộng cho HtmlHelper. Một cái gì đó như:

public static string HtmlEncode(this HtmlHelper htmlHelper, 
           string text, 
           bool preserveWhitespace) 
{ 
    // ... 
} 

Bạn có thể sử dụng String.Replace() để mã hóa các dòng mới và không gian (hoặc Regex.Replace nếu bạn cần phù hợp tốt hơn).

2

Đặt đầu ra của bạn bên trong <pre></pre> và/hoặc <code></code> khối. Ví dụ:

<pre>@someValue</pre>/<code>@someValue</code> 

Sử dụng css tương đương trên một hiện div:

<div style="white-space:pre-wrap;">@someValue</div> 

Phụ thuộc xem bạn có muốn đánh dấu ngữ nghĩa hoặc cho dù bạn muốn fiddle với css. Tôi nghĩ rằng đây là cả hai neater hơn chèn <br/> thẻ.

6

Sử dụng style="white-space:pre-wrap;" đã làm việc cho tôi. Mỗi this article.

5

Nếu bạn sử dụng Razor bạn có thể làm:

@MvcHtmlString.Create(Html.Encode(strToEncode).Replace(Environment.NewLine, "<br />")) 

theo quan điểm của bạn, hoặc trong điều khiển của bạn:

HttpServerUtility httpUtil = new HttpServerUtility(); 
MvcHtmlString encoded = httpUtil.HtmlEncode(strToEncode).Replace(Environment.NewLine, "<br />"); 

tôi đã không kiểm tra các phương pháp điều khiển, nhưng nó phải làm việc cùng một cách .

+0

Phần bộ điều khiển sẽ không biên dịch. – 1kevgriff

+0

Không biên dịch.nên là: MvcHtmlString được mã hóa = MvcHtmlString (HttpContext.Current.Server.HtmlEncode (Body) .Replace (Environment.NewLine, "
")); – AntonK

+0

"Loại 'System.Web.HttpServerUtility' không có hàm tạo nào được định nghĩa" sử dụng HttpUtility.HtmlEncode – Benoit

0
/// <summary> 
    /// Returns html string with new lines as br tags 
    /// </summary> 
    public static MvcHtmlString ConvertNewLinesToBr<TModel>(this HtmlHelper<TModel> html, string text) 
    { 
     return new MvcHtmlString(html.Encode(text).Replace(Environment.NewLine, "<br />")); 
    }