向发布的Web项目添加自定义用户控件

时间:2010-09-22 18:02:04

标签: asp.net user-controls webproject

我开始怀疑这是否可能。它看起来很简单。

我有一个已发布的网络项目。我想在发布的网站上添加一些.ascx文件(带.cs和amp; designer.cs文件)。这些是简单的自定义用户控件,可以访问已经属于原始应用程序的方法。

的问题?是否可以在发布的Web项目中删除它们而不构建整个解决方案?如果不是为什么?

当我删除这些文件并运行我的应用程序时,我收到错误: “解析错误:无法加载'我的自定义控件命名空间的名称'”。

没有很多代码可以显示,所以这就是我所拥有的。

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文件或其他东西中。也许有人可以对此有所了解。

无论如何,用代码文件替换代码隐藏可以解决问题,因为代码文件没有编译,因此在应用程序运行时是可读的。

可以找到一些有用的链接herehere

2 个答案:

答案 0 :(得分:0)

这是可能的,但你仍然需要编译你的用户控件并将该dll放入应用程序的正确bin目录中。这通常是您描述的类型加载错误的原因。

答案 1 :(得分:0)

这种做法可能很草率,你基本上都是

  • 1)在错误的项目中创建用户控件
  • 2)尝试将相同的用户控件添加到两个项目

您是否考虑过更简洁的方法,只创建一个继承自System.Web.Ui.Control的类,然后在.common项目中添加它?然后把它拉进corrct项目?您的方法的问题在于预编译和部署,您最终可能会尝试将两个用户控件放入同一文件夹中,这会破坏构建....

替代方法(以及微软方式)将是这样的......

代码 - 编写自定义控件

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 - 您需要将此控件导入所有UI页面

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