Tôi đang sử dụng các khung nhìn Razor được biên dịch trong các thư viện lớp riêng biệt như một loại hệ thống plugin cho MVC3.MVC3 - Chế độ xem dao cạo được biên dịch không thể tìm thấy _ViewStart
Tôi đã làm theo hướng dẫn của Chris Van De Steed here và chỉ bị lệch phần lớn về phần bổ sung tài liệu tham khảo, khi tôi đang tải các assembly của mình khi chạy.
Vì tôi đang tải các hội đồng vào thời gian chạy, tôi không sử dụng VirtualPathProviderViewEngine trong thư viện BoC và thay vào đó đã triển khai ViewEngine của riêng mình dựa trên RazorViewEngine. Nó hoạt động bằng cách viết lại viewPath trong CreateView để chèn không gian tên thích hợp để khung nhìn có thể được giải quyết.
Cho đến nay rất tốt ... Tôi có thể tải các mô-đun khác nhau và bộ điều khiển của chúng sẽ không xung đột nếu chúng có cùng tên.
Vấn đề duy nhất tôi có bây giờ là cho chế độ xem được biên dịch, _ViewStart không được gọi. _ViewStart hoạt động cho các khung nhìn trong dự án MVC3 host, nhưng đối với bất kỳ khung nhìn nào được nạp từ các assembly plugin thì nó không được tìm thấy.
Tôi có một thiết lập Route như thế này: -
RouteTable.Routes.MapRoute(
string.Format("Plugin{0}Route", pluginName),
string.Format(@"Plugin/{0}/{{controller}}/{{action}}", pluginName),
new { },
new string[] { string.Format("{0}.Controllers", pluginName) });
các ViewEngine trông như thế này: -
public class PluginRazorViewEngine : RazorViewEngine
{
public PluginRazorViewEngine() : base()
{
ViewLocationFormats = new[]
{
"~/Plugin/%1/Views/{1}/{0}.cshtml",
"~/Plugin/%1/Views/{1}/{0}.vbhtml",
"~/Plugin/%1/Views/Shared/{0}.cshtml",
"~/Plugin/%1/Views/Shared/{0}.vbhtml",
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
};
(% 1 được thay thế bằng tên của hội đồng)
và lắp ráp được đăng ký với thư viện BoC như sau: -
BoC.Web.Mvc.PrecompiledViews.ApplicationPartRegistry.Register(assembly, string.Format("/Plugin/{0}/", pluginName));
Khi chế độ xem được tải từ một hội đồng plugin (trong ví dụ này "tài khoản"), giao diện được tìm thấy và hiển thị OK. Nhưng sau đó nó sẽ tìm trong các địa điểm này cho _ViewStart: -
~/plugin/accounts/views/invoice/_viewstart.cshtml
~/plugin/accounts/views/invoice/_viewstart.vbhtml
~/plugin/accounts/views/_viewstart.cshtml
~/plugin/accounts/views/_viewstart.vbhtml
~/plugin/accounts/_viewstart.cshtml
~/plugin/accounts/_viewstart.vbhtml
~/plugin/_viewstart.cshtml
~/plugin/_viewstart.vbhtml
~/_viewstart.cshtml
~/_viewstart.vbhtml
Nhưng nó không nhìn vào ~/Views/Shared/_ViewStart.cshtml nơi cuộc sống tập tin.
Tôi đã thử thay đổi tất cả các định dạng vị trí trong ViewEngine của tôi (AreaMasterLocationFormats, AreaPartialViewLocationFormats, AreaViewLocationFormats, MasterLocationFormats, PartialViewLocationFormats và ViewLocationFormats) nhưng không có định dạng nào trong số chúng có vẻ khác biệt.
Tôi đã xem xét và dường như System.Web.WebPages.StartPage.GetStartPage chịu trách nhiệm tìm và trả lại trang bắt đầu trong chế độ xem, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về cách kiểm soát vị trí của trang.
tôi đã cố gắng di chuyển _ViewStart.cshtml tới ~/_ViewStart.cshtml (một trong những nơi có vẻ) tuy nhiên tôi ngay lập tức nhận được: -
Unable to cast object of type 'ASP._Page__ViewStart_cshtml' to type 'System.Web.WebPages.StartPage'.
Mà theo những gì tôi đã đọc, là vì _ViewStart cần phải sống dưới/Lượt xem
Tôi có thể sửa đổi nơi MVC tìm kiếm _ViewStart không?
Thư viện Bộc thực hiện nó IView riêng, và kêu gọi như sau: -
startPage = this.StartPageLookup(page, VirtualPathFactoryManagerViewEngine.ViewStartFileName, this.ViewStartFileExtensions);
Nhưng trong trường hợp này ViewStartFileName chỉ là "_ViewStart" và ViewStartFileExtensions chỉ cshtml và vbhtml ... không có gì đó sẽ kiểm soát nơi MVC nên tìm kiếm tệp.
Tôi đã làm như bạn đã đề xuất và tạo "PluginRazorView" của riêng mình kế thừa từ RazorView. Tôi phải ghi đè lên RenderView như bạn đã đề xuất và tôi đã cố gắng sao chép phương thức MVC GetStartPage và chỉ thêm logic của riêng tôi để tìm kiếm các đường dẫn bổ sung, tuy nhiên đó là một mìn của nội bộ và phản chiếu. chứng minh rằng nó hoạt động và tôi sẽ phải làm sạch nó sau này. Thật thú vị khi họ đã sử dụng một đại biểu ở đây ... có vẻ như các phương pháp tìm kiếm khác nhau có thể được sử dụng, nhưng không có cách nào để chỉ định chúng. Rất cám ơn sự giúp đỡ. – Aleks
Vâng, đó là những gì tôi nghĩ quá. Giống như bạn nói, họ đang sử dụng một đại biểu để cho phép thay đổi phương pháp tra cứu, nhưng sau đó khai báo nó 'nội bộ', do đó, nó chỉ là không gian tên Mvc mà thực sự có thể thay đổi nó ... – JimmiTh