Tôi đang sử dụng công cụ Razor https://github.com/Antaris/RazorEngine để phân tích cú pháp phần thân của các mẫu email của tôi. Có thể xác định bố cục và bao gồm các tệp .cshtml khác không? ví dụ: tiêu đề phổ biến và chân trang.RazorEngine layout
Trả lời
tôi có mẫu chung và làm việc bố trí, với sự giúp đỡ của hai bài viết này:
RazorEngine string layouts and sections?
Đây là giải pháp của tôi:
Giải pháp 1: Layout
Sử dụng d bằng cách thiết lập _Layout
@{
_Layout = "Layout.cshtml";
ViewBag.Title = Model.Title;
}
Footer
@section Footer
{
@RenderPart("Footer.cshtml")
}
Layout.cshtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html>
<head>
</head>
<body>
<div id="content">
@RenderBody()
</div>
@if (IsSectionDefined("Footer"))
{
<div id="footer">
@RenderSection("Footer")
</div>
}
</body>
</html>
TemplateBaseExtensions
Mở rộng TemplateBase với một RenderPart Phương pháp
public abstract class TemplateBaseExtensions<T> : TemplateBase<T>
{
public string RenderPart(string templateName, object model = null)
{
string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", templateName);
return Razor.Parse(File.ReadAllText(path), model);
}
}
Razor Config
Set BaseTemplateType để TemplateBaseExtensions lớp học của bạn
TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
BaseTemplateType = typeof(TemplateBaseExtensions<>)
};
Razor.SetTemplateService(new TemplateService(templateConfig));
Sửa Giải pháp 2:
Nếu bạn đang sử dụng một TemplateResolver.RenderPart là không cần thiết sử dụng các @Include thay
Footer
@section Footer
{
@Include("Footer.cshtml")
}
Resolver
public class TemplateResolver : ITemplateResolver
{
public string Resolve(string name)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", name);
return File.ReadAllText(path, System.Text.Encoding.Default);
}
}
Config
TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
Resolver = new TemplateResolver()
};
Razor.SetTemplateService(new TemplateService(templateConfig));
Cập nhật bởi Muffin Man Chỉ định mẫu và đưa ra một chuỗi
var templateResolver = Razor.Resolve("Registration.cshtml");
return templateResolver.Run(new ExecuteContext());
Ngoài ra tôi, cùng với những người khác tại liên kết này https://github.com/Antaris/RazorEngine/issues/61 có vấn đề với việc sử dụng _Layout
trong khi Layout
làm việc.
'_Layout' là cú pháp cũ. Nó được cập nhật thành 'Bố cục' trong một bản phát hành trong tương lai.
Bạn có thể dễ dàng thực hiện rất nhiều thứ với Dao cạo; tuy nhiên, dự án cụ thể đó dường như trừu tượng hóa rất nhiều công cụ của dao cạo mà bạn có thể làm (cả hai đều tốt và xấu). Trong trường hợp của bạn, có vẻ như bạn sẽ tốt hơn khi thực hiện giải pháp Razor của riêng bạn (nó thực sự không phải là xấu) và sau đó bạn có thể có các mẫu của bạn ném ngoại lệ hoặc kéo nội dung khác khá dễ dàng.
Ví dụ; đưa giải pháp của riêng bạn cho phép bạn tạo một lớp cơ sở cho các mẫu dao cạo của bạn, có thể làm lộ khả năng kéo vào "một phần lượt xem" bằng cách gọi các mẫu khác. Ngoài ra, bạn có thể làm mô hình kiểm tra và ném ngoại lệ nếu các thuộc tính nhất định là null.
Cách đơn giản nhất để thực hiện một bố trí với RazorEngine là bằng cách thay thế những gì mẫu của bạn trở lại trong @RenderBody() của cách bố trí:
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);
Ví dụ:
bạn _Layout.cshtml với @RenderBody điển hình()
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html>
<head>
</head>
<body>
<div>
@RenderBody()
</div>
</body>
</html>
Mẫu RazorEngine của bạn MyTemplate.cshtml
@using RazorEngine.Templating
@inherits TemplateBase<myviewmodel>
<h1>Hello People</h1>
<p>@Model</p>
Và bất cứ nơi nào bạn gọi mẫu RazorEngine:
var TemplateFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EmailTemplates");
var template = File.ReadAllText(Path.Combine(TemplateFolderPath,"MyTemplate.cshtml"));
var layout = File.ReadAllText(Path.Combine(TemplateFolderPath, "_Layout.cshtml"));
var templateService = new TemplateService();
var templateHtml = templateService.Parse(template, myModel, null, null);
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);
- 1. RazorEngine - Sử dụng Layout và Html.Raw
- 2. RazorEngine vs RazorTemplates vs RazorMachine
- 3. Chuẩn Layout C++
- 4. MSVC Object Layout Quirk
- 5. WPF Graph Layout Component
- 6. rối Layout chiến lược
- 7. JellyBean Layout Crash
- 8. Exposé Layout Algorithm
- 9. Layout như Pinterest
- 10. RazorEngine phân tích cú pháp ném Không thể biên dịch
- 11. Graph Layout sử dụng Graph #
- 12. WPF StackPanel Layout Câu hỏi
- 13. Android Relative Layout Align Center
- 14. GraphSharp .Net Graph Layout Engine
- 15. Populating Bảng Layout sử dụng JSON Chuỗi
- 16. IOS mới Facebook iPhone App UISplitViewController Layout
- 17. Zend Framework - Đặt No Layout cho Controller
- 18. Đối tượng AndroidAnimator animate backgroundColor of Layout
- 19. nguồn Xoay ImageView từ file layout xml
- 20. tuyến tính Layout Chiều cao và cân
- 21. Làm thế nào nguy hiểm là nó cho phép người dùng xác định các mẫu RazorEngine?
- 22. Sử dụng-tuyên bố trong RazorEngine (không có HtmlHelper từ MVC)
- 23. Có Constraint Layout Managers trên iPhone OS không?
- 24. HTML layout: thêm cột bên phải trang web hiện
- 25. Làm thế nào để tạo thư mục layout-small-land?
- 26. Layout Relative Không nhận được dưới đây theo quy định
- 27. Tạo Layout lập trình trong android - vấn đề
- 28. ExtJS Layout, Horizonally sau đó phát triển theo chiều dọc
- 29. C++ chuẩn Layout và Tài liệu tham khảo
- 30. CSS auto-width Layout mà không margin: auto
tôi đã cố gắng để thực hiện các giải pháp trong blog MS ở trên và tôi tiếp tục nhận được một ngoại lệ stackoverflow. Tôi đã dành cả ngày cho việc này. –
Tôi có thể gửi cho bạn một ứng dụng nhanh chóng được ném cùng nhau để bạn có được ý tưởng – ministrymason
https://rapidshare.com/files/3962348204/RazorEngineConsoleApplication.zip Nó được ném cùng nhau nhưng chắc chắn bạn sẽ có được ý tưởng. Các cơ sở applicaiton là RazorEngineConsoleApplication \ bin \ Debug vì vậy ive sao chép các mẫu vào đó. Để gắn vào ví dụ tôi đã đăng. – ministrymason