Какой лучший способ «обернуть» HTML с помощью пользовательского элемента управления? - PullRequest
1 голос
/ 13 июля 2009

В настоящее время у меня есть этот блок кода (или что-то похожее) почти на всех моих страницах:

<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 или code-behind для заполнения этого элемента управления. Все элементы должны быть видны в файле ASPX.

Ответы [ 3 ]

1 голос
/ 13 июля 2009

Посмотрите ниже, эти классы могут дать вам разметку ниже на ваших страницах .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, и вы сможете закончить все остальное. Вам нужно будет создать дизайнер, чтобы элементы управления были видны во время разработки. А потом способ их визуализации.

0 голосов
/ 18 июля 2009

Вы не можете передавать параметры в UserControls внутри источника HTML.

Вам необходимо установить параметры в событии Page_Load страницы:

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

и в исходном коде страницы:

protected void Page_Load(object sender, EventArgs e)
{
    myUserControl.SetTasks(... tasks ...);
}
0 голосов
/ 15 июля 2009

Когда вы говорите, что у вас есть один и тот же фрагмент HTML-кода на многих страницах, вы также можете проверить главные страницы.

Мастер-страница позволяет вам определить общий «фрейм страницы», который может быть повторно использован несколькими (контент-) страницами.

(но, возможно, это предложение совершенно неуместно, поскольку вы, вероятно, уже знаете о главных страницах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...