【问题标题】:What's the best way to "wrap up" HTML with a User Control?用用户控件“包装”HTML 的最佳方式是什么?
【发布时间】:2009-07-13 10:46:42
【问题描述】:

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

<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 片段包装到用户控件中?

附言。我不想使用 DataBinding 或代码隐藏来填充此控件。所有项目都必须在 ASPX 文件中可见。

【问题讨论】:

  • ...您的意思是您希望这些项目在 Visual Studio 的设计器中可见?为什么?
  • 我并没有真正想到设计师。我只是希望能够在 ASPX 代码中看到它们。

标签: asp.net user-controls


【解决方案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,您将能够完成其余的工作。您必须创建一个设计器,以便在设计时可以看到控件。然后是一种渲染它们的方法。

【讨论】:

  • 这很有趣,谢谢。使用用户控件可以实现同样的目的吗? (这有什么优势吗?)
  • 嗯,它是一个用户控件,但不是由设计师来做,而是用 C# 代码来做。我还没有真正尝试过使用用户控件。我不确定你是否可以,因为它需要 List 或数组才能将子项放入其中。
【解决方案2】:

如果您说在许多页面上都有相同的 HTML 代码,那么您可能还想查看母版页。

母版页允许您定义一个通用的“页面框架”,可供多个(内容)页面重复使用。

(但也许这个建议完全不合适,因为您可能已经知道母版页)。

【讨论】:

    【解决方案3】:

    您不能将参数传递给 HTML 源代码中的 UserControls。

    需要在页面的Page_Load事件中设置参数:

    public class MyUserControl : UserControl
    {
        public void SetTasks(Tasks[] tasks)
        {
            // code
        }
    }
    

    并在页面源代码中:

    protected void Page_Load(object sender, EventArgs e)
    {
        myUserControl.SetTasks(... tasks ...);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2019-08-05
      • 2011-06-18
      • 2023-03-11
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多