ฉันจะส่งออก html ดิบได้อย่างไรเมื่อใช้ RazorEngine (ไม่ใช่จาก MVC)


105

ฉันพยายามสร้างอีเมลที่มีเนื้อหา HTML เนื้อหานี้ผ่านการสุขาภิบาลแล้วดังนั้นฉันจึงไม่กังวลในเรื่องนี้อย่างไรก็ตามเมื่อฉันโทรไป:

Razor.Parse(template, model);

ในเทมเพลต Razor ต่อไปนี้:

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

อีเมลที่ส่งออกนั้นเข้ารหัส HTMl แต่ฉันต้องการให้มันถอดรหัส ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?


ฉันตอบคำถามนี้ แต่ถูกลบเนื่องจากเป็นคำตอบที่ซ้ำกันเพราะฉันตอบไว้ที่นี่: stackoverflow.com/questions/23603593/… ... คำตอบนี้ใช้ได้กับทั้ง MVC และ RazorEngine
Brian Rice

คำตอบ:


182

RazorEngine เช่น Razor View Engine ของ MVC จะเข้ารหัสค่าที่เขียนลงในเทมเพลตโดยอัตโนมัติ จะได้รับรอบนี้เราได้แนะนำอินเตอร์เฟซที่เรียกว่าIEncodedStringมีการใช้งานที่เริ่มต้นเป็นและHtmlEncodedStringRawString

หากต้องการใช้อย่างหลังเพียงโทรไปที่Rawวิธีการinbuilt ของTemplateBase:

@Raw(Model.EmailContent)

4
@ แมทธิวขออภัยที่รื้อฟื้น แต่แม้ว่าคอมไพล์นี้จะดูไม่สวยใน VS HTML Editor แต่ก็ไม่รู้จัก Model หรือ Raw อีกต่อไป วิธีแก้ปัญหาใด ๆ
Jeff

5
@ เจฟฟ์ฉันคิดว่าแนวทางที่ถูกต้องสำหรับ RazorEngine เพื่อแสดง Html.cs คลาสแบบคงที่ซึ่งมีวิธีการแบบคงที่ Raw เพื่อที่จะประมวลผลการเรียกมาตรฐานไปยัง Html.Raw ที่สามารถใช้เพื่อรับการเน้นไวยากรณ์ที่ถูกต้องใน VS Razor บรรณาธิการ.
Tod Thomson

9
@Manfred @Raw () ทำงานได้ดีใน RazorEngine (ไม่ใช่ Razor ของ ASP.NET MVC;))
Jeff

อยากดูเรื่องนี้แก้ไขด้วย. สิ่งนี้ทำให้โครงการทั้งหมดไม่สร้างโดยเปิดใช้งาน MvcBuildViews ...
guidupuy

2
"HtmlEncodedString" ไม่ทำงาน! แทนที่จะใช้: RawString ดูตัวอย่างได้ผล! สาธารณะ RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ("<div> Hi there! </div>");}
Charles

15

FYI ฉันมีทางแยกที่มีไวยากรณ์ @ Html.Raw (... ) ที่นี่:

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


3
@ html.Raw () ไม่จำเป็นต้องกำหนดค่าล่วงหน้า ทางออกที่ดี.
MartinJH

ฉันด้วย. ฉันสามารถสร้างแท็ก HTML และค่าใน Razor Code และส่งต่อไปยัง View with ViewData และแสดงโดยใช้ @ Html.Ras (ViewData ["NextEvent"]
JustJohn

3

หากคุณมีคลาสพื้นฐานที่กำหนดเองสำหรับเทมเพลตของคุณคุณสามารถโค้ดWriteเมธอดเพื่อให้ทำงานคล้ายกับเทมเพลต MVC ปกติหากเป็นค่าเอาต์พุตIHtmlStringก็ไม่ควรเข้ารหัส

นี่คือรหัสที่ฉันใช้ในTemplateBaseชั้นเรียน:

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



-1

ฉันพบว่าทั้งหมดนี้ใช้ได้ผลกับฉัน

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


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
คุณกำลังใช้ไลบรารี MVC ซึ่งไม่สามารถใช้งานได้จากเอ็นจินมีดโกนดังนั้นนี่จึงไม่ใช่คำตอบสำหรับคำถาม
oligofren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.