Простой механизм для преобразования объектов данных в HTML в ASP.Net - PullRequest
1 голос
/ 25 декабря 2009

Я ищу механизм для преобразования объектов данных в HTML. Элементы в объекте данных имеют как простые, так и сложные типы. Я пытался играть с HtmlTextWriter для рендеринга, но застрял со сложными типами.

Mine - проект веб-сайта ASP.Net. Я должен избегать использования серверных элементов управления (и, следовательно, отказаться от встроенных возможностей привязки), так как обработка внешнего интерфейса выполняется с помощью jQuery. Мне нужно просто сжать базовый HTML для моих объектов данных, а остальное обогащение (расположение и оформление контента) будет сделано на внешнем интерфейсе.

Я ищу простое решение (я считаю Spring.Net излишним и подавляющим, а NHAML также очень запутанным).

Кроме того, ожидается, что мое приложение будет расти в течение определенного периода времени, поэтому я должен иметь некоторое уважение к производительности. Поэтому я избегаю использования XML / XSLT на рисунке.


Например, Объект Person будет выглядеть примерно так:

Строка : Имя
Инт : возраст
Комплексный тип : адрес (включает улицу, город, почтовый индекс)
Массив типа "Квалификация" : Квалификации (включая степень, проходной год, оценки)

Желаемый вывод:

<p id="userName" class="userName">John</p>
<p id="age" class="age">35</p>
<div id="address" class="address">
    <p id="street" class="street">Express Highway</p>
    <p id="city" class="city">Mumbai</p>
    <p id="zip" class="zip">400101</p>
</div>
<div id="qualifications" class="qualifications">
    <div id="qualification1" class="qualification">
        <p id="degree1" class="degree">B.Sc.</p>
        <p id="year1" class="year">1990</p>
        <p id="grade1" class="grade">A</p>
    </div>
    <div id="qualification2" class="qualification">
        <p id="degree2" class="degree">M.Sc.</p>
        <p id="year2" class="year">1992</p>
        <p id="grade2" class="grade">A</p>
    </div>
</div>

Следует отметить, что для отображения свойств из исходного объекта данных, добавления к нему метаданных (например, атрибутов HTML-элементов и т. Д.), А затем выполнения преобразования требуется преобразователь.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2009

Я рассматриваю это как проблему дизайна и продуманный ответ на гораздо более высокую перспективу, то есть дизайн, а не код! Правильный способ сделать это будет следующим:

  • Тип персоны содержит информацию, и она ориентирована на данные , поэтому я рекомендую не возлагать на этот класс ответственность за отображение html .

  • Для начала вам понадобится абстрактный базовый класс для всех ваших объектов бизнеса / данных. Предположим [потому что он вам понадобится] BusinessBase .

  • Итак, вы должны начать писать серверный элемент управления , производный от System.Web.UI.WebContorl. Предоставьте свойство, которое принимает объект типа BusinessBase в своем наборе доступа.

  • Теперь вам нужно определить некоторые пользовательские атрибуты , которые применяются к свойствам любого подкласса типа BusinessBase. Этот атрибут содержит выходную информацию рендеринга для этого конкретного свойства объекта бизнес / данных. Украсьте все свойства , которые вы хотите отобразить в html.

  • Вернитесь к своему веб-серверу и используйте отражение, чтобы перебрать все свойства [с вашим пользовательским атрибутом] объекта, который был назначен свойству серверного элемента управления типа BusinessBase. Визуализация HTML согласно атрибуту .

Теперь используйте этот веб-серверный элемент управления и бизнес-объект в ваших клиентских приложениях asp.net. Веселитесь.

Это дизайн высокого уровня. Вам нужно быть более сдержанным и конкретный в вашем атрибуте относительно того, что HTML рендеринг генерируется для бизнес-объект.

0 голосов
/ 26 декабря 2009

Тестировали ли вы XmlSerializer или DataContractSerializer (быстрее) вместе с преобразованиями xslt, так как вы увольняете их с ходу?

Если вы все еще считаете, что xslt слишком медленный для вашего сервера, пусть клиент отобразит его как xhtml. Затем «нагрузка» процессора распространяется на всех ваших пользователей.

Учебное пособие можно найти на w3schools.com .

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

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

[Изменить] Другое решение заключается в реализации метода WriteHtml для каждого класса, и из вашего высшего класса вы будете вызывать всех ваших дочерних писателей. Ручной и эффективный (но требует больше управления, так как вы должны обновить писателя, если вы добавляете свойство).

class Person
{
   public void WriteHtml(Stream writeStream);
   {
     writeStream.Write( "<p id="userName" class="userName">{0}</p>", UserName );
     etc.
     Adress.WriteHtml(writeStream);
     writeStream.Write( "<div id="address" class="address">" );
     foreach( Address ad in Adresses ) ad.WriteHtml(writeStream);
     writeStream.Write( "</div>" );
   }
}

Вы также можете переопределить ToString () в каждом классе, чтобы вернуть представление html, и использовать его вместо этого.

Поскольку вы утверждаете, что классы просты, они должны быть удобочитаемыми и читаемыми, но я все же предпочитаю xslt, так как его легче изменить без перекомпиляции. И самая сложная часть рендеринга, которую у вас есть, это рендеринг ваших контейнерных тегов, поскольку вы храните массивы объектов. Если вы реализовали для них класс Collection, вы могли бы вместо этого поддерживать теги Container в этом классе.

class Person
{
   AddressCollection Adresses;
   // instead of
   Adress[] Adresses;
}

Тогда вопрос в том, что вы считаете «простым»: D

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