使用用户控件“包装”HTML的最佳方法是什么?

时间:2009-07-13 10:46:43

标签: asp.net user-controls

我目前在几乎所有网页上都有这段代码(或类似的东西):

<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文件中可见。

3 个答案:

答案 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 ...);
}