ASP.NET MVC 3.0 Razor, View View de n’importe quel endroit?
Est-il vrai qu'il est possible de charger la Vue à partir de n'importe où, sans
la mise en œuvre de la coutume VirtualPathProvider
MVC 3.0?
Si c'est vrai, comment le faire?
Fondamentalement, il n'est pas un problème pour mettre en œuvre personnalisée VirtualPathProvider
qui serait de charger la
Vue à partir de n'importe où, mais mon travail de mise en œuvre que dans MVC 2.0 et ne fonctionne pas avec MVC 3.0, avance une raison quelconque méthode GetFile
plus récent appelé pour n'existait pas vues MVC 3.0 et dans ce cas, je suis "Server Error in '/' Application.
"
J'ai suivi le même code pour mon custom VirtualPathProvider
à partir d'ici: http://buildstarted.com/2010/09/28/mvc-3-razor-view-engine-without-a-controller/
Mise à JOUR de 1
OK je n'ai régler mon problème avec mon custom VirtualPathProvider
après que j'ai mis l'enregistrement de mon personnalisée VirtualPathProvider
fournisseur de première ligne dans le Application_Start()
protected void Application_Start()
{
//Should be first line before routes and areas registration.
HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Lors de l'enregistrement de la coutume VirtualPathProvider dans Global.asax.cs
suivantes après AreaRegistration.RegisterAllAreas();
ou RegisterRoutes(RouteTable.Routes);
méthode override VirtualFile GetFile(string virtualPath)
l'habitude de travailler pour "Vue virtuelle".
Mise à JOUR 2
signifie que les classes RazorView
et RazorViewEngineRender
est la réponse?
Mise à JOUR 3
Si j'ai représentation de chaîne de mon rasoir point de vue qui n'existe pas dans le système de fichiers (. e.g-je stocker rasoir vues dans la base de données) comment puis-je rendre l'utilisation de ce type d'approche http://buildstarted.com/2010/09/28/mvc-3-razor-view-engine-without-a-controller/
Par exemple de représentation sous forme de chaîne de mon point de Vue, ressemble à ceci:
"@{
ViewBag.Title = ""About Us"";
}
<h2>About</h2>
<p>
Put content here.
</p>"
Mise à JOUR 4
Maintenant, je vois, pour être en mesure d'utiliser @Html.<something>
personnalisé TemplateBase devraient être mises en œuvre.
L'exemple de la mise en œuvre de HtmlTemplateBase<T>
pourrait être retrouvée ici http://www.fidelitydesign.net/?p=239, mais il ne fonctionne pas avec RazorEngine v2, je suis à atteindre le modèle compilé, puis, après l'assemblée chargée de la méthode public override void Execute()
ne sera pas exécutée j'obtiens une erreur: La méthode ou l'opération n'est pas mis en œuvre (stacktrace: http://tinypic.com/r/dcow4/7)
Pour le rendre “public override T Modèle” qui s'est passé, j'ai fait changer déclaration de “public TModel Modèle” à “public virtuel TModel Modèle” dans “public abstract class TemplateBase : TemplateBase, ITemplate”. Peut-être il y a quelques un autre changement devrait être fait? Ou quelque chose dans HtmlTemplateBase<T>
devrait être fait d'une autre façon?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Pas, le chargement d'une vue à partir de la base de données n'est pas pris en charge par défaut. Vous devez écrire votre propre
VirtualPathProvider
.Noter que Ben blog de ne pas aborder directement le problème que vous essayez de résoudre. Le blog suivant semble beaucoup plus proche de ce que vous voulez: http://rebuildall.umbraworks.net/2009/11/17/ASP_NET_MVC_and_virtual_views. Notez qu'il n'a pas d'importance si vous essayez de stocker de rasoir ou d'aspx vues dans la base de données. Chemin d'accès virtuel fournisseurs Asp.Net sont tout simplement sur le mappage d'un chemin d'accès à un flux d'octets qui sont le contenu du fichier représenté par ce chemin.
Ne pas être confondu par Ben (@BuildStarted) exemple de code dans son article. Il est détaillant comment utiliser une première version du Rasoir ViewEngine pour rendre les modèles sans l'aide d'un contrôleur de l'action. L'intention était d'être capable de rendre des modèles d'une façon générale, plutôt que comme spécifique de pages vues. (C'est ce qui a évolué dans notre RazorEngine de template cadre @ http://razorengine.codeplex.com).
La
VirtualPathProvider
est toujours une partie essentielle de ASP.NET. Il semble y avoir une confusion générale sur MVC 3DependencyResolver
être un remplacement d'uneVirtualPathProvider
mais ce n'est pas le cas, vous avez encore besoin d'un prestataire pour être en mesure d'accéder à du contenu sur un chemin d'accès virtuel (qui, d'ailleurs, tous les chemins de ASP.NET sont virtuels).Revenir ma réponse originale à cette question, vous devriez être en mesure d'obtenir ce que vous voulez simplement par le biais de sous-classement de la
RazorViewEngine
et en les utilisant pour créer votre point de vue.Avoir un oeil sur ce sujet: http://coderjournal.com/2009/05/creating-your-first-mvc-viewengine/
J'ai rencontré un problème similaire, la mise en œuvre d'un VirtualPathProvider pour l'embarqué vues de ressources. La solution était de mettre en œuvre GetFolder ainsi que GetFile. Le moteur d'affichage n'est pas seulement appel GetFile quand vous demandez la vue. Sur la première demande, il regarde dans le dossier vues pour trouver toutes les vues disponibles. Si cet appel n'a pas d'inclure votre base de données dans la liste, ils ne seront pas trouvés lorsque vous essayez de charger l'un d'eux.