0

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

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

问题?是否可以在不构建整个解决方案的情况下将这些内容放入已发布的 Web 项目中?如果不是为什么?

当我将这些文件放入并运行我的应用程序时,出现错误:“解析错误:无法加载类型'我的自定义控件命名空间的名称'”。

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

默认.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>

自定义控件.ascx

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

自定义控件.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
}
}

再一次,这似乎很容易。我错过了什么?或者这是不可能的?谢谢。

更新: 我想通了。上述情况是可能的。正如错误消息所暗示的那样,问题不在于名称空间。相反,它是代码隐藏声明。发布应用程序时会编译任何类型文件的代码隐藏文件。我仍然对为什么当您浏览 Web 目录时它似乎是可编辑的感到困惑,我认为它会存储在 .dll 文件或其他文件中。也许有人可以对此有所了解。

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

可以在此处此处找到一些有用的链接。

4

2 回答 2

0

这种方法可能很草率,你基本上要么

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

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

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

代码——编写自定义控件

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"/>
于 2012-07-18T12:17:12.200 回答
0

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

于 2010-09-22T18:08:07.603 回答