我正在尝试为多级菜单制作用户控件。我已经创建了第一级控件。它使用转发器进行迭代并实例化我自己的MenuButton类。每个MenuButton对象都有相同类型的子项。
问题是: 如何在MenuButton.aspx文件中创建MenuButton控件?
我正在使用像这样的转发器
<%@ Control ClassName="MenuButton" Language="C#" AutoEventWireup="true" CodeBehind="MenuButton.ascx.cs"
Inherits="MenuSolution._12.TEMPLATE.CONTROLTEMPLATES.MenuButton, MenuSolution, Version=1.0.0.0, Culture=neutral, PublicKeyToken=284eb573cd58385d" %>
<%@ Register TagPrefix="a" Namespace="MenuSolution._12.TEMPLATE.CONTROLTEMPLATES"
Assembly="MenuSolution, Version=1.0.0.0, Culture=neutral, PublicKeyToken=284eb573cd58385d" %>
<li runat="server">
<% if (Children.Count == 0)
{ %>
<a href="<%# Url %>"><%# Description %></a>
<% }
else
{
%>
<a href="<%# Url %>" class="dropdown-toggle" data-toggle="dropdown">
<%# Description %><b class="caret"></b></a>
<ul class="dropdown-menu multi-level">
<asp:Repeater ID="repDynamicRows" runat="server">
<ItemTemplate>
<a:MenuButton runat="server" id="button" url='<%# DataBinder.Eval(Container.DataItem, "Url") %>'
children='<%# DataBinder.Eval(Container.DataItem, "ChildItems") %>' description='<%# DataBinder.Eval(Container.DataItem, "Description") %>' />
</ItemTemplate>
</asp:Repeater>
</ul>
<%
}
%>
</li>
并且此代码不会将MenuButton代码放在最终HTML中。我试图将这个控件注册为:
<%@ Register TagPrefix="a" TagName="MenuButton" Src="~/_controltemplates/MenuButton.ascx" %>
但这导致了循环参考。
我该怎么做?
答案 0 :(得分:7)
您需要从代码而不是标记加载控件。这是由于asp.net编译器如何从标记中创建程序集。
我进行了以下更改以从代码隐藏加载控件。我还必须通过更改#to =(并在控件上具有属性)来更改数据绑定。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MenuButton.ascx.cs" Inherits="WebApplication1.MenuButton" %>
<li id="Li1" runat="server">
<% if (Children.Count == 0)
{ %>
<a href="<%= Url %>"><%= Description %></a>
<% }
else
{
%>
<a href="<%= Url %>" class="dropdown-toggle" data-toggle="dropdown">
<%= Description %><b class="caret"></b></a>
<!-- is now a server control -->
<ul class="dropdown-menu multi-level" runat="server" ID="ul1">
<!-- the page_load adds MenuButtons here -->
</ul>
<%
}
%>
</li>
public partial class MenuButton : System.Web.UI.UserControl
{
public String Url { get; set; }
public string Description { get; set; }
public List<MenuItem> Children { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (Children != null)
{
foreach (var menuItem in Children)
{
// Create a button from the ascx file
var but = (MenuButton)LoadControl("/MenuItems/MenuButton.ascx");
// bind!
but.Children = menuItem.Children;
but.Description = menuItem.Description;
but.Url = menuItem.Url;
if (ul1 != null)
{
// add our button
ul1.Controls.Add(but);
}
}
}
}
}
public class MenuItem
{
public List<MenuItem> Children { get; set; }
public String Url { get; set; }
public string Description { get; set; }
}