基类包含字段,但类型与控件的类型不兼容。

15

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

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

我有一个 Web 应用程序项目,在 App_Code 目录中有以下类,以及在 web.config 中对该类控件进行标签前缀引用。

现在该怎么办?

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
1
@CAbbott 你有什么充分的理由这么做吗?还是只是猜测而已? - Deeptechtons
6个回答

5

尝试同时指定程序集名称:

<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" />

3

取消勾选“允许这个预编译站点进行更新”选项(包括发布)。

对于运行时而言,这可能还不够。因此,请勾选“使用固定名称和单页面程序集”选项,它解决了我的问题 :)

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


只是取消“允许此预编译站点可更新”选项就解决了我的问题,谢谢!您可以通过转到属性-> MSBuild并在那里取消选择来在每个构建中启用此行为。 - Fábio Junqueira

1
我知道这篇文章有点旧了,但我也碰到了同样的错误,试图将文本框更改为标签控件。我只是将控件的ID从“Insulin”更改为“Insulin2”,问题就解决了。我不确定为什么会起作用,但这可能是向Microsoft提出的问题。
在进一步调查后,我发现如果我关闭Visual Studio中正在工作的页面选项卡,然后重新打开它,错误就完全消失了?希望这能帮助某些人。

1

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

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

那解决了我的问题。


1
在将Web Forms网站转换为MVC Web应用程序并将目标框架更改为4.6时,遇到了这个问题。 对我来说,解决方案是在web.config的pages元素上设置controlRenderingCompatibilityVersion属性:
<system.web>
   <pages validateRequest="true" controlRenderingCompatibilityVersion="4.6" clientIDMode="AutoID">
</system.web>

0
在我的情况下,我的应用程序在本地和UAT环境中都能正常工作。问题只出现在生产环境中。 所以我犯的错误是,我没有将新发布的ascx文件移动到生产环境中,相反它读取的是旧版本的发布文件。 通过将最新的文件移动到生产环境或替换它们,这个问题得到了解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接