Можно ли вывести веб-элемент управления через выражение привязки данных в шаблоне элемента управления сервера ASP.NET? - PullRequest
1 голос
/ 01 ноября 2011

Я ищу это по всему Интернету, в том числе и здесь, уже 2 дня, но я не могу найти ничего подобного, с чем сталкиваюсь.Кроме того, это мой первый пост о переполнении стека, поэтому потерпите меня, пожалуйста:]

Проблема:

Я впервые создаю шаблонный серверный элемент управления, но я выполнил это безпроблемы с помощью MSDN по шаблонным темам.Я реализовал элемент управления, который можно использовать следующим образом:

<test:TemplatedControl ID="templatedControl" runat="server">
    <Template>
        Template start:
        <%# Container.EmailText %>
        <%# Container.EmailField %>
        Template end.
    </Template>
</test:TemplatedControl>

Элемент управления использует следующий контейнер / контекст для шаблона:

public class TemplateContainer : WebControl, INamingContainer
{
    public string EmailText
    {
        get
        {
            return this.emailLabelText;
        }
    }
    string emailLabelText;


    public TextBox EmailField
    {
        get
        {
            return this.emailField;
        }
    }
    TextBox emailField;


    public TemplateContainer()
        : base(HtmlTextWriterTag.Div)
    {
        this.BorderWidth = 2;
        this.BorderStyle = BorderStyle.Outset;

        this.emailLabelText = "E-mail:";

        this.emailField = new TextBox();
        this.emailField.MaxLength = 10;
    }
}

Оба свойства класса контейнера работают нормальнои доступны через выражения привязки данных при написании шаблона, но EmailField отображается как System.Web.UI.WebControls.TextBox, что нормально для данного кода.Выходные данные элемента управления:

<div style="border-width:2px;border-style:Outset;">
    Template start:
    E-mail:
    System.Web.UI.WebControls.TextBox
    Template end.
</div>

Теперь вопрос: Возможно ли вывести элемент управления (например, TextBox здесь) в качестве фактического элемента управления обратно в шаблон в качестве других данных через выражения привязки?

Если бы это было возможно, тогда можно было бы выделить выходные данные этого элемента управления, включая его дочерние элементы управления, и при необходимости собрать их вместе с помощью шаблона.

IЯ боюсь, что этого вообще невозможно достичь, но я бы хотел, чтобы кто-то разъяснил это.Если это так, я также открыт для предложений другого подхода.Если вас интересует, почему я пытаюсь это сделать, прочитайте ниже.

Причина такого подхода:

Я создаю составной серверный элемент управления, который клиент сам будет использовать на своем сайте., который все еще находится в разработке.Поэтому окончательные требования к макету и форматированию для вывода элемента управления еще не известны.Вместо этого элемент управления должен иметь гибкий вывод с точки зрения как макета, так и дизайна, поэтому его можно настроить так, чтобы он соответствовал сайту позже.

Эта часть дизайна может быть реализована путем установки некоторых свойств класса CSS дляэлемент управления, хотя это может быть беспорядок для настройки для клиента, так как вывод элемента управления будет довольно сложным.

Я не уверен в том, как выполнить настраиваемое требование макета, например, визуализировать поля формы внутриструктура таблицы, или ее рендеринг в div, или, может быть, просто встраивание без дополнительного HTML и т. д.

Поэтому вместо того, чтобы предоставлять несколько заранее подготовленных типов вывода, я пришел к мысли, что вывод, представленный моим управлениемможет быть шаблонным, что может решить проблему как компоновки, так и гибкости дизайна.Заказчик декларативно установил бы шаблон, чтобы обернуть вокруг того, что должен отображать мой шаблон, что также позволило бы ему установить все свои классы CSS прямо там, чтобы обернуть элементы по мере необходимости.И это приводит меня к вышеупомянутой проблеме и вопросу.

Заранее спасибо,

Гаркин

1 Ответ

1 голос
/ 02 ноября 2011

Я думаю, вам нужен абстрактный класс, который определяет, что требуется для TemplateContainer. Например:

public abstract class TemplateContainer : WebControl, INamingContainer
{
    public abstract Literal EmailText { get; }
    public abstract TextBox EmailField { get; }
}

А затем требуется test:TemplateControl Template для реализации TemplateContainer.

Таким образом, вы можете использовать EmailText и EmailField для применения MaxLength и т. Д. Хотя вы, вероятно, хотите убедиться, что они не null, прежде чем использовать их

if(EmailText != null)
{
    //use EmailText
}

Потребитель серверного элемента управления затем создает элемент управления UserTemplate.ascx, подобный следующему:

Template start:
<asp:Literal ID="emailText" runat="server" />
<asp:TextBox ID="emailField" runat="server" />
Template end.

С кодом позади UserTemplate.ascx.cs:

public class UserTemplate : TemplateContainer
{
    public Literal EmailText { get { return emailText; } }
    public TextBox EmailField { get { return emailField; } }
}

---- Редактирование ----

На основании всего этого ваша страница, содержащая test:TemplatedControl, будет выглядеть (при условии, что путь к UserTemplate.ascx имеет псевдоним test:UserTemplate):

<test:TemplatedControl ID="templatedControl" runat="server">
    <Template>
        <test:UserTemplate ID="userTemplate" runat="server" />
    </Template>
</test:TemplatedControl>

И затем в коде позади вы можете получить доступ к свойствам на UserTemplate:

templatedControl.Template.EmailText.Text = "Email: ";
templatedControl.Template.EmailField.MaxLength = 10;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...