我目前在几乎所有网页上都有这段代码(或类似的东西):
<div class="tasks">
<ul>
<li><a href="#">Do something</a></li>
<li><a href="#">Do something else</a></li>
</ul>
</div>
但是,我需要将其转换为用户控件。我想要的东西如下所示:
<foo:TaskList id="foo" runat="server">
<Task><a href="#">Do something</a></Task>
<Task><a href="#">Do something else</a></Task>
</foo:TaskList>
甚至:
<foo:TaskList id="foo" runat="server">
<Tasks>
<ul>
<li><a href="#">Do something</a></li>
<li><a href="#">Do something else</a></li>
</ul>
</Tasks>
</foo:TaskList>
我意识到我在那里使用“模板”概念,我也意识到这不是你打算如何使用模板用户控件。那么.. am 我是怎么把一段可变的HTML包装成一个用户控件?
PS。我不想使用DataBinding或代码隐藏来填充此控件。所有项目必须在ASPX文件中可见。
答案 0 :(得分:1)
请看下面这些类可以在.aspx页面中给出以下标记。你可以继续深入。您需要拥有的只是父对象的属性。所以实现起来非常简单。
<Test:TestUserControl>
<Tasks>
<Test:Task Value="Some Value" Text="Some Text" />
<Test:Task Value="Another Value" Text="More Text" />
</Tasks>
</Test:TestUserControl>
namespace TestWebControls
{
public class TestUserControl : WebControl
{
private List<Task> _Tasks;
[NotifyParentProperty(true)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<Task> Tasks
{
get
{
return _Tasks;
}
set
{
_Tasks = value;
}
}
public TestUserControl()
{
}
}
public class Task : WebControl
{
public string Value { get; set; }
public string Text { get; set; }
}
}
现在,在渲染方面还有很多工作要做。因此,在ASP.NET中查找Server Controls,您将能够完成其余的工作。您必须创建一个设计器,以便在设计时可以看到控件。然后是一种渲染它们的方法。
答案 1 :(得分:0)
如果您说许多页面上有相同的HTML代码,那么您可能还想查看母版页。
母版页允许您定义一个可以被多个(内容)页面重用的公共“页面框架”。
(但也许这个建议完全不合适,因为你可能已经知道了主页)。
答案 2 :(得分:0)
您无法将参数传递给HTML源代码中的UserControl。
您需要在页面的Page_Load事件中设置参数:
public class MyUserControl : UserControl
{
public void SetTasks(Tasks[] tasks)
{
// code
}
}
并在页面源代码中:
protected void Page_Load(object sender, EventArgs e)
{
myUserControl.SetTasks(... tasks ...);
}