2010-09-22 22 views
0

Je commence à me demander si c'est possible. Cela semble tellement simple.Ajouter un contrôle utilisateur personnalisé au projet Web publié

J'ai un projet web publié. Je veux ajouter quelques fichiers .ascx (avec des fichiers .cs & designer.cs) à ce site Web publié. Ce sont des contrôles utilisateur personnalisés simples qui accèdent aux méthodes faisant déjà partie de l'application d'origine.

Question? Est-il possible de simplement les déposer dans le projet web publié sans construire la solution complète? Si non pourquoi? Lorsque j'abandonne ces fichiers et que j'exécute mon application, j'obtiens l'erreur suivante: "Erreur d'analyse: Impossible de charger le type" nom de mon espace de noms de contrôles personnalisés "".

Il n'y a pas beaucoup de code à afficher, c'est tout ce que j'ai.

Default.aspx

<%@ Page Language="C#" MasterPageFile="~/MasterPages/TwoColumn.master" AutoEventWireup="true" 
    Inherits="ApplicationName.Web.Default" CodeBehind="Default.aspx.cs" %> 

<%@ Register TagPrefix="uc1" TagName="CustomControl" Src="~/Controls/Custom/CustomControl.ascx" %> 
<asp:Content ID="content" contentplaceholder="cph" runat="Server"> 
<uc1:CustomControl ID="cc1" runat="server" CustomProperty="Hello World" /> 
</asp:Content> 

CustomControl.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CustomControl.ascx.cs" 
    Inherits="ApplicationName.Web.Controls.Custom.CustomControl" %> 
<asp:PlaceHolder ID="ph1" runat="server></asp:PlaceHolder> 

CustomControl.ascx.cs

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ApplicationName.Web.Controls.Custom 
{ 
public partial class CustomControl : System.Web.UI.UserControl 
{ 
///My logic 
} 
} 

Encore une fois, il semble si facile. Qu'est-ce que je rate? Ou est-ce pas possible? Merci.

MISE À JOUR: Je l'ai compris. Le scénario ci-dessus est possible. Le problème n'est pas avec l'espace de nom comme le suggère le message d'erreur. C'est plutôt la déclaration code-behind. Les fichiers code-behind pour tout type de fichier sont compilés lors de la publication de l'application. Je suis toujours confus quant à pourquoi il semble être modifiable lorsque vous naviguez à travers un répertoire web, je pense qu'il serait stocké dans un fichier. Dll ou quelque chose. Peut-être que quelqu'un peut faire la lumière sur cela. Quoi qu'il en soit, remplacer le code-behind par du code-code résout le problème car les fichiers de code ne sont pas compilés et sont donc lisibles à l'exécution de l'application.

Certains liens qui ont été utiles peuvent être trouvés here et here.

+0

Bien que je viens de remarquer ceci "Ce sont des contrôles utilisateur personnalisés simples qui accèdent aux méthodes déjà partie de l'application d'origine." - dites-vous que les contrôles de l'utilisateur font référence à l'application de base? – Ken

+0

Exactement! Extensions portables si vous voulez. – trevorc

+0

Eh bien l'une des raisons pour les contrôles utilisateur est la réutilisation et votre contrôle n'est pas réutilisable si cela dépend d'une application dans laquelle vous l'utilisez ... si le contrôle dépend de l'application qui expliquerait aussi pourquoi vous auriez besoin de recompiler le application entière – Ken

Répondre

0

Il est possible, mais vous devez encore compiler votre contrôle utilisateur et déposer cette DLL dans le répertoire bin approprié pour votre application. C'est généralement la cause de l'erreur de chargement de type que vous avez décrite.

+0

Je suppose que je ne comprends toujours pas. Lorsque je publie l'application, il existe de nombreux fichiers ascx qui ne sont pas compilés et fonctionnent bien. Pourquoi ne pourrais-je pas en ajouter un autre? Il semble qu'il y ait un endroit où l'application fait des références aux fichiers ascx existants lors de la construction. ?? – trevorc

0

Cette approche pourrait être bâclée, vous êtes essentiellement soit

  • 1) Création du contrôle de l'utilisateur dans le mauvais projet
  • 2) Essayer d'ajouter le même contrôle de l'utilisateur à deux projets

Avez-vous pensé à une approche plus propre et juste en créant une classe qui hérite de System.Web.Ui.Control et en l'ajoutant ensuite dans un projet .common? Puis tirant cela dans le projet corrct? Le problème avec votre approche est sur la précompilation et le déploiement que vous pourriez finir par essayer de mettre deux contrôles d'utilisateur dans le même dossier qui cassera la construction ....

L'approche alternative (et la manière de Microsoft) serait comme ceci ...

Le code - écrire un contrôle personnalisé

namespace MyProject.Common.Controls 
{ 
    public class PolicyTab : System.Web.UI.Control 
    { 
     protected override void CreateChildControls() 
     { 
      base.CreateChildControls(); 

      HtmlGenericControl policyTab = new HtmlGenericControl(); 
      policyTab.InnerHtml = "<strong> Some policy code here! </strong>"; 

      this.Controls.Add(policyTab); 
     } 
    } 
} 

La référence page - comment faire référence dans votre projet d'interface utilisateur

<CommonControls:PolicyTab runat="server" ID="temp"></CommonControls:PolicyTab> 

Web.config - ce que vous devez importez ce contrôle dans toutes vos pages d'interface utilisateur

<add tagPrefix="CommonControls" namespace="MyProject.Common.Controls" assembly="MyProject.Common"/>