2012-07-10 31 views

Trả lời

49

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?

http://blogs.msdn.com/b/hongyes/archive/2012/03/12/using-razor-template-engine-in-web-api-self-host-application.aspx

Đâ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.

+0

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. –

+0

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

+1

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

0

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.

0

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); 
Các vấn đề liên quan