2015-07-29 15 views
9

Tôi đang tìm kiếm "chén thánh" này trong một thời gian dài. Tôi đã đi qua số lượng lớn các plugin, dự án, giải pháp, vv Mỗi giải pháp thiếu một cái gì đó. Nhưng điều đầu tiên trước tiên.Sử dụng công cụ tô khuôn dao cạo bên ngoài MVC (với hỗ trợ dao cạo mvc đầy đủ)

Những gì chúng ta muốn đạt được là phải có posibility để render xem để chuỗi (lấy từ ứng dụng MVC) Dĩ nhiên toàn bộ proccess nên được thực hiện như thư viện lớp (không phải là một ứng dụng MVC)

gì tôi mong chờ là ba procces bước như thế này:

  1. Instal "một số plugin" từ NuGet và cấu hình nó
  2. copy-Paste Model và xem từ ứng dụng MVC để dự án thư viện lớp (Chú ý !!! Lần sao chép mà không cần bất kỳ sửa đổi cần thiết để "điều chỉnh" lượt xem thành "một số plugin")
  3. Viết một số dòng mã nói: "hello tôi 'một số plugin' - làm cho tôi một cái nhìn gọi là: 'myExampleView.cshtml"

Một điều kiện quan trọng: Tôi đang mong đợi một cách chính xác sự hỗ trợ tương tự trong quan điểm như tôi sẽ nhận được lượt xem trong MVC (@Html, @RenderBody @RenderSection v.v.)

Và kết quả là tôi sẽ xem lại chế độ xem này dưới dạng chuỗi - đơn giản như vậy. Có thể hay tôi chỉ "mơ"? Plugin nào cung cấp tất cả điều đó (và thậm chí có thể nhiều hơn? :))

Hiện tại - gần nhất với mô tả này là RazorEngine nhưng tôi không thấy khả năng vượt qua tên xem csthml (đủ để vượt qua đường dẫn tới cshtml) xem) Tất nhiên tôi có thể viết mã để tải nội dung tệp vào chuỗi và chuyển nó sang phương thức RunCompile nhưng nếu có bất kỳ "RederSection" nào - nó sẽ không được xử lý đúng cách (ít nhất tôi cho là không)

Để tóm tắt: Tôi muốn dao cạo MVC (khả năng sử dụng giống như trong ứng dụng MVC. Thực tế, lượt xem từ ứng dụng MVC sẽ được sao chép đơn giản vào thư viện lớp này) Trong thư viện lớp này tôi có thể tham chiếu mọi thứ (bao gồm System.Web được đề cập) , những gì tôi sẽ gọi là "giải pháp lý tưởng" của tôi

gì tôi muốn là để gọi:

namespace Example 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string renderedView = MyDreamRazoEngine.Render("MyView", new MyViewModel() { Prop1= "a", Prop2 = "b", Prop3= new List<string>() { "c", "d", "e"}) 
     } 
    } 
} 

nơi mô hình (nằm trong /Model/MyViewModel.cs) định nghĩa là:

namespace Example.Models 
{ 
    public class MyViewModel() 
    { 
     public string Prop1{get;set;} 
     public string Prop2{get;set;} 
     public List<string> Prop3{get;set;} 
    } 
} 

và xem MyView (nằm trong/Xem/MyView. cshtml) định nghĩa là:

@model Example.Models.MyViewModel 
This is my view with Prop1 : @Prop1 and Prop2 : @Prop2 and list : 
@foreach (var p in @Model.Prop3) 
{ 
    @{Html.RenderPartial("viewPartial", @p);} 
} 

xem một phần và viewPartial (nằm trong /View/viewPartial.cshtml) định nghĩa là:

@model String 

<span>I present this param3 value @Model</span> 

Từ những gì tôi có thể nói, mọi thứ (trừ xử lý tệp "tự động") đều có thể đạt được khi sử dụng dự án RazorEngine. Nhưng có lẽ ngay cả các tập tin xử lý (chính xác giống như trong MVC - tìm kiếm các mẫu trong Views và Subdirectories of Views) có sẵn trong công cụ này? Hay đó là điều tôi phải viết một mình? Hoặc có thể một số plugin khác cung cấp cho tôi tất cả các tính năng này?

@@ CẬP NHẬT

Anish trực tiếp tôi để giải pháp này: razor media type formatter for webapi

Nó sử dụng razorengine và ủng hộ quan điểm, chính xác theo cách tương tự như MVC ứng dụng (hầu như) Nhưng ... nó không hoạt động (cho chắc chắn tôi là thiếu cái gì) Những gì tôi có ngay bây giờ là:

public class RazoEngineExample 
    { 
     private static HttpRequestMessage _request; 
     static void Main(string[] args) 
     { 
      var viewParser = new RazorViewParser(baseTemplateType: typeof(WebApiContrib.Formatting.Razor.HtmlTemplateBase<>)); 
      var formatter = new RazorViewFormatter(viewParser: viewParser); 
      var config = new HttpConfiguration(); 
      config.Formatters.Add(formatter); 

      _request = new HttpRequestMessage(); 
      _request.SetConfiguration(config); 
      _request.RegisterForDispose(config); 

      var output = renderView(); 

      Console.WriteLine(output.Result); 

      _request.Dispose(); 
      _request = null; 
     } 

     private static async Task<string> renderView() 
     { 
      var cts = new CancellationTokenSource(); 
      var view = new ViewResult(_request, "view", new SampleModel() { Prop1 = "p1", Prop2 = "p2", Prop3 = new List<string> { "pe1", "pe2", "pe3" } }); 

      var response = await view.ExecuteAsync(cts.Token); 
      var output = await response.Content.ReadAsStringAsync(); 
      return output; 
     } 
    } 

nó được biên soạn Allright và nó thậm chí làm việc (nếu tôi loại bỏ vẽ một phần từ quan điểm này) Nếu tôi sử dụng xem một phần tôi nhận được báo lỗi như vậy :

[ArgumentNullException] value cannot be null. parameter name: view

Một điều (nhưng definietly kém phần quan trọng) là thông điệp điều khiển được viết bởi razorengine:

RazorEngine: We can't cleanup temp files if you use RazorEngine on the default A ppdomain. Create a new AppDomain and use RazorEngine from there. Read the quickstart or https://github.com/Antaris/RazorEngine/issues/244 for det ails! You can ignore this and all following 'Please clean ... manually' messages if yo u are using DisableTempFileLocking, which is not recommended. Please clean 'C:\Users[user_account]\AppData\Local\Temp\RazorEngine_qeouaznq. ett' manually!

Tôi đã kiểm tra - và có được đọc/ghi cho phép (trên thư mục này) thiết lập đúng.

Xin vui lòng trợ giúp !!! Tôi rất gần :)

+0

Không có đầu mối? Bất kỳ ai ? –

Trả lời

5

Có điều này là tất cả có thể. Các câu hỏi tương tự đã được hỏi trước đây

Hãy xem answer này.

Điều này one chỉ vào câu trả lời ở trên.

này project cũng có vẻ đầy hứa hẹn, nó sử dụng Razor với OWIN.

Bạn không có thể sử dụng @Html, @RenderBody@RenderSection từ gói Microsoft.AspNet.WebPages mà không có một sự phụ thuộc vào System.Web.

From what i can tell, everything (excluding "automatic" files handling) is possible to achieve using RazorEngine project. But maybe even files handling (exactly the same as in MVC - searching for templates in Views and Subdirectories of Views) is available in this engine ? Or is it something i must write by myself ? Or maybe some other plugin gives me all this features ?

razor media type formatter for webapi. Nó hiển thị giao diện IViewLocator như một phần của api và việc triển khai mặc định của nó xuất hiện để sử dụng các quy ước vị trí tệp mà bạn đã đề cập. Bạn có thể mở rộng dự án này để đạt được mục tiêu của mình.

+0

Anish - tôi đã xem xét tất cả các liên kết được đính kèm trong phản hồi của bạn. Không có gì, tôi có thể đánh dấu là "giải pháp đầy đủ" Bạn đã viết: "Tất nhiên có nhiều phương pháp triển khai khác nhau tùy theo nhu cầu của bạn" -> Tôi đã nói rõ nhu cầu của mình. Tôi muốn dao cạo MVC (khả năng sử dụng giống như trong ứng dụng MVC. Trong thực tế, quan điểm từ ứng dụng MVC sẽ chỉ đơn giản là sao chép vào thư viện lớp này) Trong thư viện lớp này tôi có thể tham khảo tất cả mọi thứ (bao gồm cả System.Web) –

+0

@PiotrFilipowicz tôi đã đã cập nhật câu trả lời của tôi và thêm một liên kết có thể giúp bạn. –

+0

cảm ơn mẹo. Tuy nhiên nó vẫn chưa hoàn thành và giải pháp "một cú nhấp chuột". Sau khi sao chép một phần mã từ các bài kiểm tra đơn vị (có sẵn trên trang github), hiển thị chuỗi từ chế độ xem - tôi vẫn nhận được: “Tên 'HTML' không tồn tại trong ngữ cảnh hiện tại” Mã nguồn được tạo cho chế độ xem này chỉ có các cách sử dụng đơn giản (hệ thống, bộ sưu tập chung, v.v.) Vì vậy, nó khá rõ ràng, rằng nó sẽ không biết "html" là gì.Ngay cả khi tôi thêm thích hợp sử dụng (và tham khảo thích hợp) vẫn còn nó sẽ không biết về html (vì đây là HtmlHelper) nhu cầu của tôi ("không thay đổi trong quan điểm cần thiết") không được đáp ứng –

Các vấn đề liên quan