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:
- Instal "một số plugin" từ NuGet và cấu hình nó
- 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")
- 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 :)
Không có đầu mối? Bất kỳ ai ? –