2012-05-03 13 views
7

Tôi muốn sử dụng mẫu Razor sau đây với RazorEngine:RazorEngine - Sử dụng Layout và Html.Raw

@{ 
    Layout = null; 
} 

@Html.Raw(MyNamespace.MyClass.SomePropertyWithHtml) 

Khi tôi gọi nó là tôi nhận được 2 lỗi - một trong những phàn nàn nó không thể xử lý Layout, và khác phàn nàn nó không biết làm thế nào để đối phó với người trợ giúp Html.

Có các câu hỏi và câu trả lời khác ở đây cho thấy điều này là có thể trong v3 và tôi đang sử dụng gói hiện tại trên NuGet - v3.0.8 - nhưng không rõ cách thực hiện việc này. Hiện tại tôi đang gọi nó như vậy:

string html = RazorEngine.Razor.Parse(File.ReadAllText(path)); 

Câu trả lời khác đề xuất sử dụng Razor.SetBaseTemplate đầu tiên, không xuất hiện trong nguồn hiện tại hoặc nhánh 3.0 trên git. Nhìn vào mã tôi thấy mã tham chiếu các bố trí và các phần, nhưng mã bố trí dường như phụ thuộc vào việc phân giải mẫu theo tên, trong khi những gì tôi đang cố gắng làm thậm chí không cần phải giải quyết mẫu - tôi chỉ cần nó để đối phó với Layout = null. Mã này cũng bao gồm một MvcTemplateBase xuất hiện để cung cấp một HtmlHelper trong dự án Web - nhưng nó là lớp duy nhất trong dự án đó và không được tham chiếu ở bất kỳ đâu trong các dự án Web hoặc Core.

này câu hỏi tương tự: RazorEngine issues with @Html

Chỉ cần liên kết đến trang chủ nói rằng bạn có thể tìm hiểu thêm ở đó - các trang web chỉ là một câu ngắn mô tả dự án.

Vì vậy, làm cách nào để phân tích cú pháp chế độ xem Dao cạo ở trên với RazorEngine v3.0?

+0

Ồ, bạn đang sử dụng RazorEngine ... Một điều cần lưu ý là Razor không phải là MVC. Rất nhiều công việc đã được thực hiện với RazorEngine mới nhưng Antaris đã thực sự bận rộn gần đây. Bạn sẽ có thể sử dụng '@inherits MvcTemplateBase ' ở đầu tệp để sử dụng nó. – Buildstarted

+2

Cảm ơn bạn đã đề xuất. Tôi nhận ra Razor và MVC là riêng biệt, nhưng mục tiêu của tôi là sử dụng cùng một mẫu MVC Razor bên trong và bên ngoài đường ống ASP.Net bình thường. Phiên bản trên NuGet không chứa một lớp có tên là MvcTemplateBase. Phiên bản mới nhất trên Git, nhưng nó không phải là chung chung - nó chỉ là MvcTemplateBase. Nếu tôi thêm một dòng như @inherits RazorEngine.Razor.MvcTemplateBase tôi nhận được một ngoại lệ trong TemplateService.SetModelExplicit phàn nàn kiểu mẫu không có thuộc tính có tên là Model. Ý tưởng? –

Trả lời

2

Thuộc tính LayoutHtml helper không phải là một phần của TemplateBase, và thực hiện các MvcTemplateBase đó là một phần của phiên bản mới nhất của RazorEngine (v3.4.1) xuất hiện chưa đầy đủ (InitHelpers dường như không để khởi tạo những người giúp đỡ ?). Bạn sẽ cần tạo mẫu cơ sở của riêng mình để triển khai các tính năng này.

Như bạn đã lưu ý, phiên bản v3 + không bao gồm phương thức Razor.SetBaseTemplate. Bạn có thể thiết lập một kiểu mẫu cơ bản trong phiên bản hiện tại như sau:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>) 
    }; 

using (var service = new RazorEngine.Templating.TemplateService(config)) 
{ 
    Razor.SetTemplateService(service); 
    return MvcHtmlString.Create(Razor.Parse<TModel>(templateText, model)); 
} 

Nếu bạn cần để khởi tạo những người giúp đỡ, nó có thể hữu ích để ghi đè CreateInstance trong việc thực hiện tùy chỉnh của IActivator, có thể được cung cấp cho các TemplateServiceConfiguration như số BaseTemplateType:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     BaseTemplateType = typeof(MyTemplateBase<>), 
     Activator = new MyActivator() 
    }; 
+0

Hmm bạn đang sử dụng phiên bản RazorEngine nào? Hay bạn đã lấy MvcTemplateBase làm lớp học của riêng bạn? Nguồn hiện tại không có phiên bản chung của MvcTemplateBase: https://github.com/Antaris/RazorEngine/blob/master/src/Web/RazorEngine.Mvc/MvcTemplateBase.cs –

+0

Đó là một triển khai trong nhà của MvcTemplateBase.Điểm ở trên là chứng minh rằng bạn vẫn * có thể * trong thực tế thiết lập một mẫu cơ sở để kế thừa tất cả các khung nhìn của bạn, cho phép bạn triển khai trình trợ giúp Html, chức năng Bố cục cơ sở hoặc bất cứ điều gì bạn cần mà TemplateBase của RazorEngine không đưa ra khỏi hộp. – jdmcnair

+0

Làm rõ câu trả lời của tôi ở trên. Tôi nhận thấy trước đó rằng câu hỏi này đã hơn 2 tuổi, nhưng tôi nghĩ rằng điều này vẫn còn trả lời nó. Hãy cho tôi biết nếu có gì không rõ ràng. Có lẽ điều này vẫn sẽ giúp ai đó. – jdmcnair