Хороший способ сделать повторяющийся шаблон для данных в asp.net - PullRequest
2 голосов
/ 15 января 2009

Я создаю веб-страницу, на которой я отображаю n самые последние новостные посты на первой странице, и это метод, который получает сообщения и возвращает их в .aspx-файл. Я использую asp: substitution-control для вставки строки в веб-страницу.

Я думаю, что мой способ сделать это немного грязный и уродливый, и не очень гибкий, если я хочу внести небольшие изменения в шаблон. Есть ли способ для меня, чтобы достичь того, что я хочу, имея сам шаблон в отдельном файле .aspx или .ascx? Я пытался, но не могу придумать умный способ передачи данных в файл шаблона.

Плюс, когда (если?) Я поместил шаблон в отдельный файл - как я могу повторить его в другом .aspx-файле (в пределах заполнителя содержимого, если это имеет значение. Макет контролируется главной страницей) ) с разными значениями для каждого экземпляра?

public static string getShortPosts(int postNumber)
{
    DbConnection d = new DbConnection();
    DataTable tbl = d.selectQuery("SELECT TOP (" + postNumber + ") news.id, news.title, news.newsContent, news.excerpt, news.date, news.userid, news.urlTitle, " +
                                    "news.isPublished, users.firstName, users.lastName FROM news INNER JOIN users ON news.userid = users.userid " +
                                    "ORDER BY id DESC;");
    DataTableReader r = tbl.CreateDataReader();

    StringBuilder s = new StringBuilder("");

    while (r.Read())
    {
        /* THIS */ 
        s.Append(
            "<div class=\"newsBox\">" + System.Environment.NewLine +
            "<h2>" + r["title"]+ "</h2>" + System.Environment.NewLine +
            "<p>" + r["excerpt"] + "</p>" + System.Environment.NewLine +
            "</div>" +System.Environment.NewLine+System.Environment.NewLine
            );
    }

    return s.ToString();
}

Ответы [ 3 ]

1 голос
/ 15 января 2009

Интересный вопрос.

Я думаю, что вы можете создать и файл трансформации .xslt, который будет применен к источнику xml, сгенерирует необходимый вам html.

Так что на ваших страницах вы должны иметь только элемент управления asp: Xml:

<asp:Xml ID="xmlMyControl" runat="server" />

В коде позади вы должны применить преобразование, загружая соответствующий файл xslt:

XslTransform xslt = new XslTransform();
xslt.Load(Server.MapPath("~/myTransformationFile.xslt"));

xmlMyControl.Transform = xslt;

xmlMyControl.DocumentContent = myMethodToRetrieveXML(); // Your source data, return xml as a string
xmlMyControl.DataBind();

Я вижу по вашему коду, что у вас есть DataTable в качестве источника данных, но я думаю, что преобразовать его в строку XML не составит труда.

Таким образом, у вас будет только один шаблон (файл .xslt), и все внесенные в него изменения будут автоматически отражаться везде, где вы его используете.

1 голос
/ 15 января 2009

Я бы предложил шаблонные элементы управления. Есть много обучающих программ онлайн; Вот статья MSDN по этому вопросу: http://msdn.microsoft.com/en-us/library/aa478964.aspx

В этой статье мы рассмотрели, как создать пользовательский ASP.NET без привязки к данным серверный контроль, который использовал использование шаблона. Поймите, что контроль может быть расширен, чтобы обеспечить несколько шаблонов, так же, как DataList предоставляет множество шаблоны. Мы добавили поддержку шаблонов выполнив следующие действия:

  • Создание закрытой переменной-члена типа ITemplate в DisplayStats контрольный класс.
  • Создан открытый оператор свойства чтения-записи для шаблона.
  • Создан класс (StatsData), косвенно полученный из класса Control, который предоставленные свойства, которые мы хотели разрешить разработчику страницы доступ к шаблон через синтаксис привязки данных.
  • Переопределен метод CreateChildControls (). Этот метод очистил Контролирует коллекцию, создал экземпляр StatsData, затем создание экземпляра StatsData в шаблон, и, наконец, добавил Экземпляр StatsData для элементов управления коллекция.
  • Переопределил метод DataBind (), который вызвал CreateChildControls () способ.

С шаблонными элементами управления вы можете иметь собственную настройку, аналогичную ретранслятору с элементами репитера. Где вы можете выставить DataItem и написать всю разметку в интерфейсе. Это также довольно дружественный к дизайнеру. Однако огромной стоимостью является повышенная сложность. Я бы определенно зарезервировал его для важных или многократно используемых элементов управления.

1 голос
/ 15 января 2009

Если бы это был я, я бы создал пользовательский элемент управления, предназначенный для создания одной записи в списке. Элементу управления нужен только один параметр (номер сообщения, за который он отвечает). Сама страница должна только поддерживать массив (или список или любую структуру, которую вы предпочитаете) этих пользовательских элементов управления и добавлять их на любую панель, в которой они должны отображаться динамически.

Пользовательский элемент управления будет содержать панель с классом «newsBox», метку для заголовка и другую панель (или, возможно, просто обычный абзац HTML) для содержимого, поэтому его вывод будет таким же, как и то, что вы создаете в своем пример. Разница в том, что он будет создан с использованием объектов ASP и HTML вместо строки.

Кроме того, если бы это был я, у меня не было бы пользовательского элемента управления, отвечающего за запрос собственных данных из базы данных. DAL действительно был бы здесь полезен, поскольку у вас могла бы быть функция «GetNewsDetails (int postNumber)», которая могла бы кэшировать новостные сообщения, если они были запрошены недавно, и при необходимости может быть использована другими элементами управления.

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