我有以下用户控件(现在,更多将在同一个命名空间中)
Ortund.Project.UserControls.FooControl
Ortund.Project.UserControls.BarControl
我在我的 web.config 中正确引用了这些(我知道我已经让这些控件在页面上正常工作)。
<pages>
<controls>
<add tagPrefix="ortund" tagName="Foo" src="~/UserControls/FooControl.ascx" />
<add tagPrefix="ortund" tagName="Bar" src="~/UserControls/BarControl.ascx" />
</controls>
</pages>
这允许我在标记中使用控件,如下所示:
<div>
<ortund:Foo runat="server" ID="oFoo" />
<ortund:Bar runat="server" ID="oBar" />
</div>
至少,如果页面的设计器文件在上述命名空间中正确引用了它们。
相反,我在我的设计器文件中找到的是这样的:
/// <summary>
/// oFoo control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UserControl oFoo;
/// <summary>
/// oBar control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UserControl oBar;
现在,我可以进入并更改它,但由于文件是自动生成的,它往往会无缘无故地再次更改回来。因此,我无法访问用户控件中可能拥有的任何公共字段,这是功能的主要问题。
那么为什么我的设计师文件如此明目张胆,如此愚蠢地错误,我该如何解决呢?
根据我对UserControl
行为不端的经验,通常是因为您的控件的命名空间有些“奇怪”,或者存在 Visual Studio 无法解决的继承层次结构,或者,您正在执行某些操作web.config
这低于应用程序级别(尽管这通常会导致命名空间的某些部分被切断并且 .designer.cs 拒绝编译)。
我刚刚创建了您上面案例的“简单”复制品,设计师将声明正确地为:
protected global::Ortund.Project.UserControls.FooControl oFoo;
一种选择是对声明上方的注释采取行动(“修改将字段声明从设计器文件移动到代码隐藏文件。”)并将声明从 .designer.cs 文件移动到 .cs 文件中。这可能会阻止设计者重新生成不正确的声明,尽管它已经这样做的事实可能意味着有足够的错误,尽管您尽了最大努力,它仍会继续这样做。
有关您的解决方案/项目结构以及用户控件和页面的继承层次结构(如果有)的更多信息可能有助于缩小范围!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句