Làm cách nào để xuất html thô khi sử dụng RazorEngine (KHÔNG phải từ MVC)


105

Tôi đang cố tạo email có nội dung HTML. nội dung này đã được xử lý vệ sinh nên tôi không lo lắng về vấn đề đó, tuy nhiên khi tôi gọi:

Razor.Parse(template, model);

trên mẫu Razor sau:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        @(new System.Web.HtmlString(Model.EmailContent))
    </body>
</html>

email được xuất ra được mã hóa HTMl, nhưng tôi cần nó được giải mã. Làm thế nào tôi có thể thực hiện điều này?


Tôi đã trả lời câu này, nhưng nó đã bị xóa vì một câu trả lời trùng lặp vì tôi đã trả lời nó ở đây: stackoverflow.com/questions/23603593/… ... câu trả lời này hoạt động cho cả MVC và RazorEngine.
Brian Rice

Câu trả lời:


181

RazorEngine, giống như Razor View Engine của MVC, sẽ tự động mã hóa các giá trị được ghi vào mẫu. Để giải quyết vấn đề này, chúng tôi đã giới thiệu một giao diện được gọi là IEncodedString, với các triển khai mặc định là HtmlEncodedStringRawString.

Để sử dụng phương thức thứ hai, chỉ cần gọi Rawphương thức có sẵn của TemplateBase:

@Raw(Model.EmailContent)

4
@Matthew Xin lỗi vì đã phục hồi, nhưng mặc dù cái này biên dịch, nó trông không đẹp trong VS HTML Editor, nó sẽ không nhận ra Model hoặc Raw nữa. Bất kỳ giải pháp thay thế?
Jeff

5
@Jeff Tôi đang nghĩ cách tiếp cận phù hợp là để RazorEngine hiển thị một lớp tĩnh Html.cs có phương thức tĩnh .Raw để nó sẽ xử lý các lệnh gọi chuẩn tới Html.Raw có thể được sử dụng để đánh dấu cú pháp chính xác trong VS Razor người biên tập.
Tod Thomson

8
@Manfred @Raw () hoạt động tốt trong RazorEngine (chứ không phải của ASP.NET MVC Razor;))
Jeff

Cũng muốn thấy điều này được giải quyết. Điều này làm cho toàn bộ dự án không xây dựng với MvcBuildViews kích hoạt ...
guidupuy

2
"HtmlEncodedString" không hoạt động! Thay vào đó hãy sử dụng: RawString. Hãy xem một ví dụ hoạt động! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Xin chào! </div>");}
Charles

15

FYI Tôi có một fork bao gồm cú pháp @ Html.Raw (...) ở đây:

https://github.com/Antaris/RazorEngine/pull/105


3
@ Html.Raw () không yêu cầu cấu hình trả trước. Giải pháp tốt.
MartinJH

Tôi cũng vậy. Tôi đã có thể tạo các thẻ và giá trị HTML trong Razor Code và chuyển nó đến Chế độ xem với ViewData và hiển thị bằng @ Html.Ras (ViewData ["NextEvent"]
JustJohn

3

Nếu bạn có một lớp cơ sở tùy chỉnh cho các mẫu của mình, bạn có thể mã Writephương pháp để hoạt động tương tự như mẫu MVC bình thường: nếu giá trị đầu ra là IHtmlStringnó thì không nên mã hóa nó.

Đây là mã tôi đang sử dụng trong TemplateBaselớp của mình :

// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
    if (value is IHtmlString)
        WriteLiteral(value);
    else
        WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(), false));
}

// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
    Buffer.Append(value);
}

3

Tôi đang sử dụng RazorEngine 3.8.2 và hoạt @Raw(Model.Content)động hoàn toàn tốt đối với tôi.



-1

Tôi thấy tất cả những thứ này đều hiệu quả với tôi.

@{var myHtmlString = new HtmlString(res);}
@myHtmlString


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
Bạn đang sử dụng thư viện MVC không có sẵn từ công cụ dao cạo, vì vậy đây không phải là câu trả lời cho câu hỏi.
oligofren
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.