Tôi đã viết các triển khai VirtualFile và VirtualPathProvider tùy chỉnh đang thu thập thành công tài nguyên được nhúng là Chế độ xem một phần.Sử dụng VirtualPathProvider tùy chỉnh để tải tài nguyên nhúng Một phần Chế độ xem
Tuy nhiên, khi tôi cố gắng để làm cho chúng nó tạo ra lỗi này:
The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
Khi render quan điểm một phần, bên trong một Xem thông thường, nó trông giống như sau:
Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");
Điều gì khiến nó tin rằng đây không phải là một phần xem?
CHỈNH SỬA: Tôi đã đăng mã cho cả tệp ảo & triển khai nhà cung cấp tệp ảo cho bất kỳ ai gặp phải vấn đề này khi tìm giải pháp đó. Câu hỏi này cũng sẽ phục vụ tốt cho những người dựa trên tiêu đề câu hỏi.
ere là việc thực hiện VirtualFile để tham khảo:
public class SVirtualFile : VirtualFile
{
private string m_path;
public SVirtualFile(string virtualPath)
: base(virtualPath)
{
m_path = VirtualPathUtility.ToAppRelative(virtualPath);
}
public override System.IO.Stream Open()
{
var parts = m_path.Split('/');
var assemblyName = parts[1];
var resourceName = parts[2];
assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName);
var assembly = System.Reflection.Assembly.LoadFile(assemblyName + ".dll");
if (assembly != null)
{
return assembly.GetManifestResourceStream(resourceName);
}
return null;
}
}
VirtualPathProvider:
public class SVirtualPathProvider : VirtualPathProvider
{
public SVirtualPathProvider()
{
}
private bool IsEmbeddedResourcePath(string virtualPath)
{
var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/Succeed.Web/", StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
return IsEmbeddedResourcePath(virtualPath) || base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath)
{
if (IsEmbeddedResourcePath(virtualPath))
{
return new SVirtualFile(virtualPath);
}
else
{
return base.GetFile(virtualPath);
}
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
{
if (IsEmbeddedResourcePath(virtualPath))
{
return null;
}
else
{
return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
}
Và tất nhiên, đừng quên đăng ký cung cấp dịch vụ mới này trong file Global.asax của dự án của bạn trong sự kiện Application_Start()
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());
Cảm ơn bạn rất nhiều. Niềm tiếc duy nhất của tôi là tôi có nhưng một người bỏ phiếu để đưa ra. = P Up Bình chọn câu trả lời này –
@ darin Dimitrov Tôi không cho rằng bạn biết một mẹo mà tôi có thể sử dụng để khuyến khích intellisense coi đây là một Xem khi bên trong dll của tôi? Ngay bây giờ, tôi có rất ít hỗ trợ intellisense với quan điểm mà tôi đặt trong dll của tôi –
@MatthewCox, tôi không biết nhiều về Intellisense trong quan điểm. Đã lâu rồi tôi không còn dựa vào nó nữa. Bạn không nhận được Intellisense nếu tập tin có phần mở rộng '.cshtml'? –