【发布时间】:2018-01-31 20:02:52
【问题描述】:
守则:
父控件.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ParentControl.ascx.cs"
Inherits="ParentControl" %>
<%@ Register Src="~/ChildControl.ascx" TagPrefix="Prefix" TagName="ChildControlTag" %>
ParentControl.ascx.cs
public partial class ParentControl : UserControl
{
List<ASP.childcontrol_asxc> controlList = new List<ASP.childcontrol_asxc>();
... inside a public property setter ...
var control = new ASP.childcontrol_ascx(); // <ABC> what the heck is this reference?
controlList.Add(control);
...
}
ChildControl.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChildControl.ascx.cs"
Inherits="ChildControl" %>
<asp:Repeater ID="childRepeater" runat="server" EnableViewState="false"
ViewStateMode="Disabled">
ChildControl.ascx.cs
public partial class ChildControl : UserControl
{
...
protected void Page_Load(object sender, EventArgs e)
{
childRepeater.DataSource = xyz; // <XYZ> crashes if I don't use the weird reference
}
}
问题:
我不明白标有<ABC> 的参考评论是什么意思。那不是我定义的类……但 Intellisense 不会抱怨。如果我按下F12,它会将我带到 ChildControl.ascx 顶部的<%@ Control ... %> 标记,而不是 ChildControl.ascx.cs 中的控件定义。
我不明白这个控件的其他版本是什么,为什么它在 ASP 命名空间中,或者直接使用它而不是控件的含义是什么。更糟糕的是,这在我的本地工作站上编译得很好,但在我们用于 CI 的 TFS 服务器上会引发编译器错误。
问题:
是否有人知道这种使用/引用自定义用户控件的方法的名称,和/或有我可以查看的链接/信息以更好地了解这是什么以及含义是什么?我一直无法通过谷歌找到任何有用的东西。虽然修复/解决方法会很棒 - 我仍然希望能够研究这项技术。
探索:
我尝试用实际的类名替换用法,而不是奇怪的ASP.class_ascx 引用...如果我这样做,它编译得很好,但不幸的是它在运行时失败。似乎其他参考更改了它与 asp.NET 生命周期的交互方式 - 在子控件的 aspx 中定义的服务器控件在子控件的Page_Load() 中为空(标记为<XYZ>)。在奇怪的ASP.control_ascx 参考方法下,当它击中子控件的Page_Load() 时,中继器被正确定义,但我不明白为什么。
其他:
该项目通过DotNetCompilerPlatform NuGet package 在我的本地工作站上使用 Roslyn 编译器,但我相信它只是使用 CI 服务器上的 VS/TFS 2015 内置编译器。这可以解释为什么 TFS 会引发编译器错误 - 它告诉我 The type or namespace name 'usercontrol_ascx' does not exist in the namespace 'ASP' (are you missing an assembly reference?)。我正在考虑将 TFS 配置为使用 NuGet 包中的编译器,然后有望编译 - 但这仍然很奇怪,我想了解它。
【问题讨论】:
-
您的代码缺少
new关键字。 -
原来如此 - 不错。那只是一个复制/粘贴错误...我已经修复了它。
-
很奇怪。想知道您是否对 mychildusercontrol 的解决方案进行了简单搜索。还要检查用户控件内的公共道具。另请注意,通过执行
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ChildControl.ascx.cs" Inherits="ChildControl" ClassName="childctrl" %>,用户控件可以具有与文件名不同的类名。当您使用 ASP 命名空间时,class 名称 (childctrl) 将出现在智能感知中,即ASP.childctrl。最后的想法是重建(不是构建)。 -
@wazz 抱歉,错字 - 应该是
var control = new ASP.childcontrol_ascx();而不是 mychildusercontrol。它是在 childcontrol.aspx.cs 中定义的 ChildControl,但对它的引用很奇怪。正如 SLaks 所指出的,它是它的“编译”版本......但它仍然给我带来了问题。 -
很难找到有关这方面的文档。
标签: c# asp.net compiler-errors language-features assembly-references