L'aide personnalisée VirtualPathProvider de charge intégré des ressources des Vues Partielles
J'ai écrit personnalisé VirtualFile et VirtualPathProvider des implémentations réussir à obtenir les ressources intégrées qui sont des Vues Partielles.
Cependant, lorsque je tente de la rendre, il produit cette erreur:
The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
Lors du rendu de la vue partielle, à l'intérieur d'un Affichage normal, il ressemble à la suivante:
Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");
Ce qui est à l'origine de croire que ce n'est pas une vue partielle?
EDIT: j'ai Posté mon code pour le fichier virtuel & fichier virtuel fournisseur d'implémentation de quelqu'un qui tombe sur cette recherche de solution sur l'obtention de ce composant de travail. Cette question sera aussi bien servir pour ceux basés sur la question du titre.
ere est la VirtualFile mise en œuvre de référence:
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);
}
}
}
Et bien sûr, n'oubliez pas d'enregistrer ce nouveau fournisseur dans le monde.asax fichier de votre projet dans le Application_Start() événement
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());
Vous devez vous connecter pour publier un commentaire.
Parce que maintenant vous êtes au service de votre vue à partir de quelque lieu inconnu, il n'est plus le
~/Views/web.config
fichier qui s'applique et indique la classe de base pour votre rasoir vues (<pages pageBaseType="System.Web.Mvc.WebViewPage">
). Ainsi, vous pouvez ajouter un @hérite de la directive en haut de chaque vue intégrée pour indiquer la classe de base..cshtml
extension?@Html
helper s'appuie sur les espaces de noms en cours dans leweb.config
dans le dossier Vues. Comme la réponse indique, vous devriez être en mesure d'importerSystem.Web.Mvc.Html
etSystem.Web.Mvc
directement dans le point de vue d'intellisense pour ceux.J'ai utilisé de la Fpo réponse comme une base, mais il s'est étendu sur un peu et intégré la réponse à la question dans ma solution.
Cela semble quelque peu fréquemment posées question ici et je n'ai pas vu de réponse complète, donc j'ai pensé qu'il pourrait être utile de partager ma solution de travail.
Je charge mes ressources à partir d'une base de données et je les ai mis en cache dans le Cache par défaut (Système d'.Web.La mise en cache.Cache).
Ce que j'ai fait était de créer un personnalisé CacheDependency sur la TOUCHE que j'utilise pour la recherche de la ressource. De cette façon, chaque fois que mon code invalide qui cache (sur une édition, etc.) la dépendance de cache sur cette clé est retirée, et le VirtualPathProvider à son tour invalide le cache et le VirtualFile obtient reloaded.
J'ai aussi modifié le code pour qu'il ajoute automatiquement hérite de déclaration, de sorte qu'il n'a pas besoin d'être stockés dans ma base de données de ressources et j'ai aussi automatiquement ajouter un peu par défaut à l'aide des déclarations comme cette "vue" n'est pas chargé par la voie normale, de sorte que rien par défaut inclut dans votre site web.config ou viewstart ne sont pas utilisables.
CustomVirtualFile:
CustomVirtualPathProvider:
Espérons que cette aide!
Je se pencha fortement sur l'information dans l'OP, ainsi que Darin Dimitrov la réponse de créer un simple prototype pour le partage de composants MVC pour l'ensemble des projets. Alors que ceux qui ont été très utiles, j'ai toujours couru dans quelques-uns des obstacles supplémentaires qui sont abordés dans le prototype, comme l'aide à un échange de vues avec @du modèle.