2010-09-22 2 views
0

Я начинаю задаваться вопросом, возможно ли это. Это просто кажется простым.Добавить пользовательский элемент управления в опубликованный веб-проект

У меня есть опубликованный веб-проект. Я хочу добавить некоторые .ascx-файлы (с .cs & файлами designer.cs) на этот опубликованный веб-сайт. Это простые пользовательские элементы управления, которые используют методы, уже входящие в исходное приложение.

Вопрос? Можно ли просто отказаться от них в опубликованном веб-проекте без создания всего решения? Если не так?

Когда я отбрасываю эти файлы и запускаю свое приложение, я получаю сообщение об ошибке: «Ошибка анализа: не удалось загрузить тип» имени моего пользовательского пространства имен элементов управления ».

Существует не так много кода, чтобы показать, так что это все, что у меня есть.

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 
} 
} 

Опять же, кажется, так легко. Что мне не хватает? Или это невозможно? Благодарю.

ОБНОВЛЕНИЕ: Я понял это. Вышеупомянутый сценарий возможен. Проблема заключается не в пространстве имен, как это предлагает сообщение об ошибке. Скорее это декларация с кодом. Файлы кода для любого типа файлов компилируются при публикации приложения. Я все еще запутался относительно того, почему он доступен для редактирования, когда вы просматриваете веб-каталог, я думаю, он будет храниться в DLL-файле или что-то в этом роде. Может быть, кто-то может пролить свет на это.

В любом случае, заменяя код-код кодом, он исправляет проблему, поскольку файлы кода не компилируются и поэтому читаются во время выполнения приложения.

Некоторые ссылки, которые были полезны, могут быть найдены here и here.

+0

Хотя я только заметил это «Это простые пользовательские элементы управления, которые получают доступ к уже существующим приложениям». - Вы говорите, что пользователь контролирует ссылку на основное приложение? – Ken

+0

Точно! Портативные надстройки, если хотите. – trevorc

+0

Ну, одна из причин пользовательских элементов управления - повторное использование, и ваш контроль не может использоваться повторно, если он зависит от приложения, в котором вы его используете ... если элемент управления зависит от приложения, которое также объясняет, почему вам необходимо перекомпилировать всего приложения. – Ken

ответ

0

Возможно, но вы все равно должны скомпилировать свой пользовательский элемент управления и отбросить эту dll в соответствующий каталог bin для вашего приложения. Это обычно является причиной ошибки загрузки типа, описанной вами.

+0

Думаю, я до сих пор не понимаю. Когда я публикую приложение, существует множество файлов ascx, которые не компилируются и работают нормально. Почему я не могу добавить еще один? Похоже, что где-то приложение создает ссылки на существующие файлы ascx при создании. ?? – trevorc

0

Этот подход может быть неаккуратным, вы в основном либо

  • 1) Создание пользовательского элемента управления в неправильном проекте
  • 2) Попытка добавить один и тот же пользовательский элемент управления для двух проектов

Задумывались ли вы о более чистом подходе и просто создаете класс, который наследуется от System.Web.Ui.Control, а затем добавляете это в .common проект? Затем потянув это в проект corrct? Проблема с вашим подходом заключается в предварительной компиляции и развертывании, вы можете в конечном итоге попытаться поместить два пользовательских элемента управления в одну и ту же папку, которая сломает сборку.

Альтернативный подход (и путь к Microsoft) будет таким, как это ...

код - написать пользовательский элемент управления

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); 
     } 
    } 
} 

Ссылка страницы - как ссылаться на него в проекте UI

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

Web.config - то, что вам нужно импортируйте этот элемент управления во все ваши страницы пользовательского интерфейса.

<add tagPrefix="CommonControls" namespace="MyProject.Common.Controls" assembly="MyProject.Common"/> 
Смежные вопросы