【问题标题】:Base class includes field but type not compatible with type of control基类包含字段但类型与控件类型不兼容
【发布时间】:2012-01-04 01:27:43
【问题描述】:

基类包含字段“lbl”,但其类型(web.App_Code.CustomLabelControl)与控件类型(web.App_Code.CustomLabelControl)不兼容。

我以前用同样的方法做过很多自定义控件,但今天我遇到了这个错误。

我有一个 web 应用程序项目,在 App_Code 目录中有以下类,web.config 中的 tagprefix 引用用于类中的控件。

我现在该怎么办?

Web.Config

<system.web>
    <pages>
        <controls>
            <add namespace="web.App_Code" tagPrefix="CControls"/>...

标记

<form id="form1" runat="server">
<div>
    <CControls:CustomLabelControl runat="server" OnClickText="Welcome" ID="lbl">
    </CControls:CustomLabelControl>
</div>
</form>

类文件

namespace web.App_Code
{
    public class CustomLabelControl : Control, IPostBackEventHandler, IPostBackDataHandler
    {
        private string _onClickText;

        public CustomLabelControl()
        {

        }

        public string OnClickText
        {
            get { return _onClickText; }
            set { _onClickText = value; }
        }

        public void RaisePostBackEvent(string eventArgument)
        {
            throw new System.NotImplementedException();
        }


        public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
        {
            throw new System.NotImplementedException();
        }


        public void RaisePostDataChangedEvent()
        {
            throw new System.NotImplementedException();
        }
    }
}

我已经检查了这些资源:

【问题讨论】:

  • 您是否尝试过从System.Web.UI.WebControls.Label 类而不是Control 派生您的类?
  • @CAbbott 您是否有充分的理由这样做?或者只是猜测

标签: c# asp.net postback web-controls app-code


【解决方案1】:

也尝试指定程序集名称:

<add tagPrefix="CControls" namespace="web.App_Code" assembly="web.App_Code" />

为了清楚起见,我会考虑为您的自定义控件创建一个专用命名空间。也许像web.App_Code.CustomControls:

<add tagPrefix="CControls" namespace="web.App_Code.CustomControls" assembly="web.App_Code.CustomControls" />

【讨论】:

    【解决方案2】:

    取消选中构建(和发布)选项“允许此预编译站点可更新”

    对于运行时来说可能不够用,所以选中“使用固定命名和单页程序集”选项,它解决了我的情况:)

    这里有一个关于这个错误的有用链接:http://forums.asp.net/t/960707.aspx

    【讨论】:

    • 只需取消选中“允许此预编译站点可更新”即可,谢谢!您可以通过转到 Properties -> MSBuild 并在此处取消选中它来在每个构建中启用此行为
    【解决方案3】:

    在 web.conf 中引用 ascx 用户控件,而不是像这样的 aspx 页面:

    <add tagPrefix="proj1" src="~/userControls/Invoiceshow.ascx" tagName="proj1tagname">
    

    这解决了我的问题。

    【讨论】:

      【解决方案4】:

      我知道这是旧的,但我在尝试将文本框更改为标签控件时遇到了同样的错误。我只是将控件的 ID 从“Insulin”更改为“Insulin2”,从而解决了这个问题。我不确定它为什么会起作用,但这可能是微软的一个问题。

      在进一步研究之后,我注意到如果我关闭了我在 Visual Studio 中正在处理的页面的选项卡,然后重新打开它,错误就消失了?我希望这对某人有所帮助。

      【讨论】:

        【解决方案5】:

        在将 Web Forms 网站转换为 MVC Web App 并将目标框架更改为 4.6 时遇到此问题。 我的解决方案是在 web.config 中的 pages 元素上设置 controlRenderingCompatibilityVersion 属性:

        <system.web>
           <pages validateRequest="true" controlRenderingCompatibilityVersion="4.6" clientIDMode="AutoID">
        </system.web>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-17
          • 2011-04-14
          • 1970-01-01
          • 2013-10-30
          • 2019-04-05
          • 2022-01-11
          • 1970-01-01
          相关资源
          最近更新 更多