Ho scritto implementazioni VirtualFile e VirtualPathProvider personalizzate che stanno ottenendo risorse incorporate che sono Viste parziali.Utilizzo di VirtualPathProvider personalizzato per caricare la risorsa incorporata Viste parziali
Tuttavia, quando tento di renderli produce questo errore:
The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
Quando il rendering del vista parziale, all'interno di un normale vista, sembra che il seguente:
Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");
Che cosa sta inducendo a credere che questa non sia una visione parziale?
MODIFICA: Ho inserito il mio codice per entrambi i file virtuali & implementazioni di provider di file virtuali per chiunque si imbatta in questa ricerca di soluzioni per far funzionare quel componente. Questa domanda servirà anche per quelli basati sul titolo della domanda.
ere è l'implementazione VirtualFile di riferimento:
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);
}
}
}
E, naturalmente, non dimenticate di registrare questo nuovo provider nel file Global.asax del progetto nell'evento Application_Start()
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());
Grazie mille. Il mio unico rimpianto è che ho solo un voto da dare. = P Up Vota questa risposta –
@ darin Dimitrov Non credo che tu sappia di un trucco che potrei impiegare per incoraggiare l'intellisense a trattare questo come una vista quando dentro la mia DLL? In questo momento, ho molto poco supporto intellisense con le visualizzazioni che ho inserito nella mia DLL –
@ MatthewCox, non ne so molto di Intellisense nelle visualizzazioni. È passato molto tempo da quando ho smesso di fare affidamento su di esso. Non ottieni Intellisense se il file ha l'estensione '.cshtml'? –