2009-05-28 23 views
1

J'ai essayé les éléments suivants:Pourquoi cette vue héritée ne s'affiche-t-elle pas?

J'ai une bibliothèque partagée (.dll) qui contient ces fichiers:

  • Vues
    • Recherche
      • PowerSearch.aspx
      • PowerSearch .aspx.cs
      • PowerSearch.aspx.designe r.cs

Le fichier contient PowerSearch.aspx mon code html. Le fichier contient PowerSearch.aspx.cs ceci:

using System.Web.Mvc; 
using CommonProject.Web.Shared.Controllers; 

namespace CommonProject.Web.Shared.Views.Search 
{ 
    public partial class PowerSearch : ViewPage<SearchViewData>{} 
} 

Et le designer, je catually ne se soucient même pas parce que ce n'est pas utilisé de toute façon.

Rien d'extraordinaire, juste une vue fortement typée.
J'ai fondamentalement tiré une vue de travail existante de mon projet asp.net mvc, l'ai mise dans une bibliothèque séparée et j'ai changé l'espace de nom pour qu'il contienne le mot "Partagé" comme "partagé entre plusieurs projets mvc".

Ensuite, dans mon projet original mvc asp.net, j'ai créé la même structure, seulement maintenant la page aspx ne contient que la règle asp @Page.

Le fichier correspondant cs contient:

using System.Web.Mvc; 
using CommonProject.Web.Shared.Controllers; 

namespace CommonProject.Web.DRE.Views.Search 
{ 
    public partial class PowerSearch : CommonProject.Web.Shared.Views.Search.PowerSearch { } 
} 

Il n'y a pas d'erreurs de compilation et aucune exception de temps d'exécution soit. Il n'y a qu'une énorme page blanche ...

Quelqu'un a une idée?

+0

Je devine parce que le Html dans la DLL n'est tout simplement pas ramassé pour rendre. Mais je ne suis pas sur. –

Répondre

0

Assurez-vous que l'assemblage (dll) est dans votre dossier bin que vous référencez. Essayez également d'ajouter l'espace de nom de l'assembly à votre fichier web.config, sinon votre vue ne pourra pas trouver la page héritée.

 
<pages> 
     <namespaces> 
     <add namespace="CommonProject.Web.Shared"/> 
+0

La DLL est dans le dossier bin. Je n'ai pas ajouté l'espace de noms. Mais avec notre sans la règle de l'espace de noms n'a pas d'importance. Ce qui est agaçant, c'est que ça ne lance rien. Juste une page blanche ... –

+0

J'ai également maintenant remarqué que les vues sont littéralement copiées dans mon dossier bin. –

+0

dans votre assembly at-il le aspx, aspx.cs et aspx.designer.cs? vous ne devriez avoir besoin que du fichier aspx.cs dans votre assembly. – David

0

À quel point est-ce difficile d'essayer d'ajouter une page ASPX à une bibliothèque de classes ?! Ce n'est pas dans la liste par défaut lorsque vous sélectionnez 'Ajouter un nouvel élément ...'. Je sais que c'est OK pour stocker les contrôleurs et les modèles dans une DLL/assembly bibliothèque séparée, mais je suis assez sûr qu'il n'est pas aussi trivial de stocker ou de partager les vues. Le problème est que le moteur d'affichage par défaut recherche dans un dossier spécifique sur le disque pour la vue (~/Views/Controller/ViewName.as [pc] x ou ~/Views/Shared/ViewName.as [pc] x). Avec une DLL de bibliothèque, le compilateur n'a aucune idée de ce qu'il peut faire avec votre fichier ASPX. Ce n'est pas du code, donc à moins d'avoir un ensemble 'Build Action', ça va juste l'ignorer. Il y a plusieurs 'Actions Construites' mais je pense que vos seules options sont 'Copier' et 'Incorporer comme Ressource'. La copie ne va pas copier dans le dossier dont vous avez besoin (le dossier Views dans votre projet Web ASP.NET MVC), bien que vous puissiez éventuellement écrire un script de build ou 'Custom Tool' qui l'a fait pour vous (avec un peu de travail).La renommée de Hammett (de Castle Monorail) (et maintenant MS Employee) est venue avec un exemple qui vous permet de stocker des vues à l'intérieur des assemblages de bibliothèque en utilisant une classe VirtualPathProvider personnalisée qui est capable de creuser dans la DLL et de sortir le View (incorporé en tant que ressource). L'exemple d'application est juste un concept en ce moment, donc vous pourriez rencontrer quelques obstacles, mais cela semble fonctionner et semble être une direction passionnante. Vous pouvez le trouver sur son blog ici: MEF and ASP.NET MVC sample. Téléchargez le code et faites un peu d'exploration.

Cet article de blog ASP.NET MVC Plugins n'est pas du même auteur que celui ci-dessus, mais il donne un autre examen du sujet et pointe vers un autre article ici sur StackOverflow où une question similaire a été posée: Using VirtualPathProvider to load ASP.NET MVC views from DLLs.

J'ai vu un article de Phil Haaaaaaaaaaaaaaaaaack sur le stockage des vues dans la base de données. Il utilise des scripts Ruby au lieu de Web Forms, donc je ne suis pas sûr à 100% si vous pouvez adapter son échantillon à vos besoins ou non. Vérifiez-le ici: Scripting ASP.NET MVC Views Stored In The Database. A quoi ressemble la source pour le fichier .aspx?

+0

Thx un bouquet. J'avais vu le billet de phil plus tôt, mais je n'y ai pas pensé dans ce contexte. Je vais vérifier l'échantillon de mef & mvc. –

+0

Je n'ai pas "ajouter => nouveau" Je viens d'avoir trois projets de site ayant la même vue. Parce que je n'ai pas compris comment obtenir des vues dans un projet séparé, j'ai continué à les maintenir tous les trois. Avec les problèmes attendus de la négligence humaine ... Donc c'était en fait un autre moment "c'est ça, je centralisais ce truc". –

+0

En outre, je viens de faire glisser les vues d'un projet à la bibliothèque. Mais il semble que ce n'est pas cet idéal. L'IDE ne le reconnaît plus en tant que vue, donc plus de support IDE pour les propriétés Html et Model :( –

0

Assurez-vous héritez votre point de vue dans la directive page comme ceci:

<%@ Page Title="" Inherits="CommonProject.Web.Shared.Views.Search.PowerSearch" %&> 

De plus, si vous ne souhaitez pas spécifier l'espace de noms entier dans votre directive de page, vous pouvez ajouter à la <namespaces/section> Dans votre web.config:

<add namespace="CommonProject.Web.Shared.Views.Search"/> 
+0

Ceci est une vérification, mais je n'ai pas inclus l'espace de noms car je veux que mes vues héritées soient nommées de la même manière. besoin de la directive namespace complètement de toute façon. –

Questions connexes