Napisałem niestandardowe implementacje VirtualFile i VirtualPathProvider, które pomyślnie uzyskują osadzone zasoby, które są częściowymi widokami.Używanie niestandardowej usługi VirtualPathProvider do ładowania zasobu osadzonego Częściowe widoki
Jednak, gdy próbuję je uczynić go produkuje ten błąd:
The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
Podczas renderowania częściowego widoku wewnątrz regularnego widzenia, wygląda następująco:
Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");
Co powoduje, że nie jest to częściowy widok?
EDYCJA: Wysłałem mój kod do wirtualnego pliku & implementacji wirtualnych dostawców plików dla każdego, kto natknął się na to, szukając rozwiązania na temat działania tego składnika. To pytanie będzie również dobrze służyć osobom bazującym na tytule pytania.
ere jest realizacja VirtualFile dla odniesienia:
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);
}
}
}
I oczywiście, nie zapomnij, aby zarejestrować nowego dostawcę w pliku Global.asax swojego projektu w Application_Start() zdarzenie
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());
Dziękuję bardzo. Żałuję tylko, że mam tylko jeden głos do oddania. = P Up Głosuj na tę odpowiedź –
@ darin Dimitrov Nie sądzę, że znasz sztuczkę, którą mógłbym użyć, aby zachęcić intellisense do potraktowania tego jako widoku w mojej bibliotece dll? W tej chwili mam bardzo mało wsparcia intellisense z widokami, które umieściłem w moim dll –
@MatthewCox, nie wiem zbyt wiele o Intellisense w poglądach. Dawno temu przestałem polegać na tym. Czy nie otrzymujesz Intellisense, jeśli plik ma rozszerzenie '.cshtml'? –