เป็นไปได้หรือไม่ที่จะใช้ Razor View Engine นอก asp.net


102

ถ้าฉันดู Razor View Engine ฉันจะเห็นไวยากรณ์ที่ดีและกระชับมากซึ่งไม่ได้เชื่อมโยงกับการสร้าง html เป็นพิเศษ ดังนั้นฉันจึงสงสัยว่าการใช้เอ็นจิ้นนอก asp.net ในสภาพแวดล้อม. net "ปกติ" จะง่ายเพียงใดเช่นสร้างข้อความโค้ด ...

ยินดีต้อนรับตัวชี้ตัวอย่างความคิดเห็นหรือคำอธิบายใด ๆ

คำตอบ:


80

มีสองประเด็นที่นี่:

  1. ได้คุณสามารถเรียกใช้ Razor View Engine นอกบริบทของโดเมนแอป ASP.NET ตามที่อธิบายไว้ในบล็อกของ Andrew: http://vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet แก้ไขสำหรับ mvc3-rc.html
  2. อย่างไรก็ตาม Razor ยังคงมุ่งเน้นไปที่การสร้างมาร์กอัปแบบ xml (เช่น HTML) เป็นหลักในแง่ที่ Razor parser ใช้การมีอยู่ของ<tags>เพื่อกำหนดการเปลี่ยนระหว่างโค้ดและมาร์กอัป คุณอาจใช้เพื่อสร้างข้อความใด ๆ ก็ได้ แต่คุณอาจประสบปัญหาเมื่อผลลัพธ์ของคุณไม่ตรงกับสมมติฐานของ Razor เกี่ยวกับความตั้งใจของคุณ

ตัวอย่างเช่นแม้ว่านี่จะเป็นรหัสมีดโกนที่ถูกต้อง (เนื่องจาก<div>แท็ก):

@if(printHello) {
   <div>Hello!</div>
}

ข้อมูลโค้ดต่อไปนี้ไม่ถูกต้อง (เนื่องจาก Hello! ยังคงถูกถือว่าเป็นโค้ด):

@if(printHello) {
   Hello!
}

อย่างไรก็ตามมี<text>แท็กพิเศษที่สามารถใช้เพื่อบังคับให้มีการเปลี่ยนแปลงสำหรับบล็อกหลายบรรทัด ( <text>แท็กจะไม่แสดงผล):

@if(printHello) {
   <text>Hello!
   Another line</text>
}

นอกจากนี้ยังมีไวยากรณ์ที่สั้นกว่าเพื่อบังคับให้บรรทัดเดียวเปลี่ยนโดยใช้@::

@if(printHello) {
   @:Hello!
}

2
ฉันกำลังคิดที่จะใช้มันเพื่อสร้างสิ่งต่างๆเช่นอีเมลหรือการสร้างรหัส IronPython ในทันที เนื่องจากสิ่งเหล่านี้ไม่ได้ใช้แท็กจึงควรดูทางเลือกอื่น ๆ ขอบคุณสำหรับคำตอบ.
Thomas

6
@Thomas Razor ควรจะทำได้ดีในสถานการณ์เหล่านั้นคุณจะต้องเพิ่ม<text>แท็กเวทย์มนตร์เหล่านั้นหรือใช้เป็นระยะ@:ๆ เมื่อการสนับสนุนตัวแก้ไข VS ออกมาสำหรับไวยากรณ์ของ Razor มันจะค่อนข้างง่ายที่จะบอกว่าการเปลี่ยนเกิดขึ้นเมื่อใด
marcind

34

ตรวจสอบRazorEngineเป็นเฟรมเวิร์กเล็ก ๆ ที่สร้างขึ้นบน Razor ที่ช่วยให้คุณทำสิ่งนี้ได้


มีปัญหาในการติดตั้งโครงการนี้บนแอปพลิเคชันการกำหนดเป้าหมาย. net 4 จำเป็นต้องมีการอัปเดต
Johnny_D

22

ลองดูห้องสมุดRazorTemplates มีน้ำหนักเบากว่าไลบรารี RazorEngine ปลอดภัยต่อเธรดและมีอินเทอร์เฟซที่เรียบง่ายมาก

การคอมไพล์และเรนเดอร์เทมเพลตทำได้ง่ายเพียงแค่โค้ดสองบรรทัด:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));

1
คุณกำลังเน้นถึงความปลอดภัยของเธรดของ RazorTemplates b / c หนึ่งในวิธีแก้ปัญหาอื่น ๆ ที่แนะนำสำหรับคำถามนี้ใช่หรือไม่? ฉันสนใจ RazorEngine เป็นพิเศษ
Steve Scheffler

9

ทั้งสองRazorEngineและRazorTemplatesจะกล่าวถึงอยู่ที่นี่แล้ว แต่ตรวจสอบRazorMachine คุณสามารถชี้แอปที่ไม่ใช่ MVC ของคุณไปยังโฟลเดอร์ ~ / Views ของแอป MVC ที่มีอยู่ (อื่น) ดำเนินการด้วยการส่งแบบจำลองที่เหมาะสมและรับเอาต์พุตที่แสดงผลบนโค้ด 2 บรรทัด:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);

3

สร้างโค้ดหรือข้อความ: คุณหมายถึงเหมือน T4 Templates: http://msdn.microsoft.com/en-us/library/bb126445.aspxหรือ codemith tools?


สิ่งนี้ต้องการการโหวตเพิ่มเนื่องจาก T4 มีความคล้ายคลึงกับ Razor และเป็นตัวสร้างโค้ดอเนกประสงค์ที่แท้จริงซึ่งจัดส่งออกจากกล่องเป็นฟีเจอร์ใน Visual Studio โดยพื้นฐานแล้วมันคือ 'Razor' อเนกประสงค์
Dan Ling

ฉันเข้าใจว่าเทมเพลต T4 สามารถเปลี่ยนแปลงได้ในเวลาคอมไพล์เท่านั้นไฟล์. tt จะถูกแปลงและบันทึกเป็นไฟล์. cs ในการใช้งานของฉันผู้ใช้กึ่งเทคนิคต้องการอัปเดตเทมเพลตโดยไม่ต้องสร้างแอปพลิเคชันใหม่ มีวิธีง่ายๆที่สามารถทำได้โดยใช้เทมเพลต T4 หรือไม่?
daveb

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