Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法隐式转换类型';System.Web.UI.CompiledTemplateBuilder';定制项目板_C#_Asp.net_Webforms_Custom Controls - Fatal编程技术网

C# 无法隐式转换类型';System.Web.UI.CompiledTemplateBuilder';定制项目板

C# 无法隐式转换类型';System.Web.UI.CompiledTemplateBuilder';定制项目板,c#,asp.net,webforms,custom-controls,C#,Asp.net,Webforms,Custom Controls,创建ListView时,控件上有一个属性,允许您在LayoutTemplate中指定占位符的ID,该占位符用于保存每个项的控件 <asp:ListView ID="lvTest" runat="server" ItemPlaceholderID="testPlaceholder"> <LayoutTemplate> <ul> <asp:PlaceHolder ID="testPlaceholder" run

创建ListView时,控件上有一个属性,允许您在LayoutTemplate中指定占位符的ID,该占位符用于保存每个项的控件

<asp:ListView ID="lvTest" runat="server" ItemPlaceholderID="testPlaceholder">
    <LayoutTemplate>
        <ul>
            <asp:PlaceHolder ID="testPlaceholder" runat="server" />
        </ul>
    </LayoutTemplate>
    <ItemTemplate>
        <li>Item</li>
    </ItemTemplate>
</asp:ListView>
但是,如果我像下面这样将模板添加到.aspx文件中,我会得到一个错误,即CS0029:无法将类型“System.Web.UI.CompiledTemplateBuilder”隐式转换为“ControlLibrary.TestTemplate”

<CustomControls:TestContainer ID="testContainer" runat="server">
    <TestTemplate>
        test
    </TestTemplate>
</CustomControls:TestContainer>

测试
是否可以这样做,或者我必须将所有可配置属性放在父容器本身上


谢谢你能提供的任何帮助

除了模板属性声明之外,所有操作都正确。任何模板都必须声明为
System.Web.UI.ITemplate
。只需将模板声明替换为:

public ITemplate TestTemplate { get; set; }
它应该开始工作了。有关参考,请参阅

若要使用模板的自定义属性进行操作,您需要再添加一个从集合继承的类:

public class TestTemplateList : List<TestTemplate> { }
之后,您应该能够以两种方式声明控件。您可以跳过指定
TestTemplates
,因为它在
ParseChildrenAttribute
中声明为
DefaulProperty

<CustomControls:TestContainer runat="server" ID="testContainer">
    <CustomControls:TestTemplate Name="test">
    </CustomControls:TestTemplate>
</CustomControls:TestContainer>

<%-- OR --%>

<CustomControls:TestContainer runat="server" ID="wc11">
    <TestTemplates>
        <CustomControls:TestTemplate Name="test">
        </CustomControls:TestTemplate>
    </TestTemplates>
</CustomControls:TestContainer>


感谢您的回复!将属性类型更改为ITemplate允许页面无错误地加载,但我仍然不确定如何将属性添加到模板本身。这可能吗?例如,我希望更新我的答案,而不是。@JKasper11。您需要对
TestTemplate
的默认容器做一些小动作。
[ParseChildren(true, DefaultProperty = "TestTemplates")]
public class TestContainer : Control, INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public TestTemplateList TestTemplates { get; set; }

    // ... OnLoad and DataBind left intact

    protected override void CreateChildControls()
    {
        Controls.Clear();

        var phTest = new PlaceHolder();
        phTest.ID = "phTest";

        Controls.Add(phTest);

        if (this.TestTemplates != null)
        {
            foreach (var testTemplate in TestTemplates)
            {
                ((ITemplate)testTemplate).InstantiateIn(phTest);    
            }
        }

        this.ChildControlsCreated = true;
    }
}
<CustomControls:TestContainer runat="server" ID="testContainer">
    <CustomControls:TestTemplate Name="test">
    </CustomControls:TestTemplate>
</CustomControls:TestContainer>

<%-- OR --%>

<CustomControls:TestContainer runat="server" ID="wc11">
    <TestTemplates>
        <CustomControls:TestTemplate Name="test">
        </CustomControls:TestTemplate>
    </TestTemplates>
</CustomControls:TestContainer>