Универсальное управление данными и их обслуживание с использованием чистого HTML. Однако для сбора данных вам понадобится хранилище данных. Чтобы избежать многих проблем, связанных с использованием сервера базы данных, вы можете собирать эти данные в формате XML. Вот основная структура нашего проекта:
<пользователь>
<имя/>
<фамилия/>
<ми/>
</user>
Изначально я ограничил данные именем, фамилией и отчеством. Основная идея этой страницы заключается в том, что на этой странице можно получить информацию о пользователе. После того как потребности пользователя в информации удовлетворены, процесс необходимо перейти к следующему логическому этапу сбора. Для простоты я оберну пользовательскую функциональность в класс ASP.
Функция Coalesce(vVar, vAlt)
Если vVal = "" Или VarType(vVal) = 1 Или VarType(vVal) = 0 Тогда
Объединение = vAlt
Еще
Объединение = vVal
Конец, если
Конец
класса функции CUser
Частный m_SQL, m_DOM
Открытая собственность Получить DOM()
Установить DOM = m_DOM
Конец свойства
Public Sub saveUser()
m_SQL.save "сохранить_пользователя", m_DOM
Завершить
подпубличную функцию validate()
m_DOM.loadXML "<root>" и m_SQL.validateUser(m_DOM) и "</root>"
Если не m_DOM.selectSingleNode("//error") Ничего, Тогда
проверить = Ложь
Еще
проверить = Истина
Конец, если
Конечная функция
Private Sub CollectData(dom, oCollection)
Dim nItem, узел, родительский_узел, n, sKey
Для nItem = 1 To oCollection.Count
sKey = oCollection.Key(nItem)
Установите родительский_узел = dom.selectSingleNode("//" & sKey & "s")
Если не родительский_узел — это ничего, тогда
Для n = 1 To oCollection(sKey).Count
Установить узел = родительский_узел.selectSingleNode(sKey & _
"[строка(.)='" &
oCollection(sKey)(n) и "']")
Если узел — ничто, тогда
Set node = dom.createNode(1, sKey, "")
Установить узел = родительский_узел.appendChild(узел)
Конец, если
node.text = Coalesce(oCollection(sKey)(n), "")
Следующий
Еще
Set node = dom.selectSingleNode("//" & sKey)
Если не узел — это ничего, тогда _
node.text = Coalesce(oCollection(sKey), "")
Конец, если
Следующий
Завершить подчастный
подкласс_Initialize()
Установите m_SQL = Новый CSQL.
Установите m_DOM = Server.CreateObject("MSXML2.DOMDocument")
m_DOM.async = Ложь
Если VarType(Request("txtUserXML")) = 0 Или Request("txtUserXML") = "" Тогда
Запрос m_DOM.loadXML("txtUserXML")
Еще
m_DOM.load "<root>" & Server.MapPath("user.xml") & "</root>"
Конец, если
собирать данные m_DOM, Request.Form
собирать данные m_DOM, Request.QueryString
Завершить подчастный
подкласс_Terminate()
Установите m_SQL = Ничего
Установите m_DOM = Ничего
Конец Под
Конец Класса
Класс CSQL
Частное m_DAL,
сохранение общедоступной функции m_Stream (sStoredProc, oDOM)
'adVarChar = 200
m_DAL.RunSP Array(m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))
Открытая функция
конечной функции validateUser(oDOM)
Установите m_Stream = m_DAL.RunSPReturnStream("validate_user", Array(_
m_DAL.mp("@xml_param", 200, 8000, oDOM.xml)))
validateUser = m_Stream.ReadText(-1)
m_Stream.Close
Конечная функция
Private Sub Class_Initialize()
Установите m_DAL = Server.CreateObject("MyPkg.MyDAL")
m_DAL.GetConnection «некоторая строка подключения»
Установите m_Stream = Server.CreateObject("ADODB.Stream")
Завершить подчастный
подкласс_Terminate()
Установить m_DAL = Ничего
Установите m_Stream = Ничего
Конечный
подконечный класс
Класс CSQL построен на основе компонента уровня доступа к данным (m_DAL) MyPkg.MyDAL. Этот компонент построен на основе компонентов Fitch и Mather DAL, которые можно найти в MSDN. Таким образом мы строим мост между SQL Server и вашим кодом.
Когда объект CUser инициализируется, он собирает данные запроса и использует подфункцию CollectData() для помещения собранных данных в соответствующий узел в UserDOM. (Код я не буду объяснять, потому что его довольно легко понять сам по себе.) После сбора данных (или нет) мы воспользуемся XSL для преобразования содержимого данных в макет.
<?xml версия="1.0"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform
версия="1.0">
<xsl:output метод="html"/>
<xsl:template match="/">
<xsl:if test="//error">
<font color="red">*Обязательна информация, выделенная красным<br/></font>
</xsl:if>
<xsl:apply-templates select="//user"/>
</xsl:template>
<xsl:template match="user">
<шрифт>
<xsl:attribute name="color">
<xsl:выбрать>
<xsl:when test="//error[.='first name']">красный</xsl:when>
<xsl:иначе>черный</xsl:иначе>
</xsl:выбрать>
</xsl:атрибут>
Имя:
</font>
<input type="text" name="first_name">
<xsl:attribute name="value"><xsl:value-of
select="first_name"/></xsl:attribute>
</вход><br/>
<шрифт>
<xsl:attribute name="color">
<xsl:выбрать>
<xsl:when test="//error[.='mi']">красный</xsl:when>
<xsl:иначе>черный</xsl:иначе>
</xsl:выбрать>
</xsl:атрибут>
МИ:
</font>
<input type="text" name="mi">
<xsl:attribute name="value"><xsl:value-of select="mi"/></xsl:attribute>
</вход><br/>
<шрифт>
<xsl:attribute name="color">
<xsl:выбрать>
<xsl:when test="//error[.='last_name']">красный</xsl:when>
<xsl:иначе>черный</xsl:иначе>
</xsl:выбрать>
</xsl:атрибут>
Фамилия:
</font>
<input type="text" name="last_name">
<xsl:attribute name="value"><xsl:value-of
select="last_name"/></xsl:attribute>
</вход><br/>
</xsl:template>
</xsl:stylesheet>
Эта таблица стилей преобразует содержимое в макет. Проверка ошибок важна, и хранимые процедуры проверяют данные, определяя, нуждаются ли они в обработке. Возвращает узел «ошибки» для каждого поля, которое не может быть пустым, но не содержит заполненных данных. Вывод этого XML примерно следующий:
<user> .</user><errors><error>first_name</error>.
Эта таблица стилей преобразует контент в макет. Проверка ошибок важна, и хранимые процедуры проверяют данные, определяя, нуждаются ли они в обработке. Возвращает узел «ошибки» для каждого поля, которое не может быть пустым, но не содержит заполненных данных. Вывод этого XML-кода примерно следующий:
<user>.</user><errors><error>first_name</error>.
Обратите внимание, что если есть ошибка, соответствующая имени узла. результат будет красный. Нам нужен следующий ASP, чтобы объединить все предыдущие вещи.
<%@ Language=VBScript %>
<%
Опция явная
Dim oUser
Установить oUser = NewCUser
Если oUser.validate() Тогда
Установить oUser = Ничего
Сервер.Перенос «NextPage.asp»
Конец, если
%>
<html>
<тело>
<form метод="POST" action="GetUser.asp" name="thisForm" id="thisForm">
<%
Response.Write xslTransform(oUser.DOM, "user.xsl")
%>
<input type="hidden" name="txtUserXML" id="txtUserXML"
value="<%=oUser.DOM.xml%>">
<input type="submit" value="Submit">
</форма>
</тело>
</html>
<%
Установить oUser = Ничего
Функция xslTransform(vXML, XSLFileName)
Тусклый m_xml, m_xsl
Если ВарТип(vXML) = 8 Тогда
Установите m_xml = m_dom
m_xml.loadXML vXML
ИначеЕсли VarType(vXML) = 9 Тогда
Установите m_xml = vXML
Конец, если
Если m_xml.parseError.errorCode <> 0 Тогда _
Err.Raise vbObjectError, "XMLTransform(...)", m_xml.parseError.reason
Установите m_xsl = Server.CreateObject("MSXML2.DOMDocument")
m_xsl.async = Ложь
m_xsl.load Server.MapPath(XSLFileName)
Если m_xsl.parseError.errorCode <> 0 Тогда _
Err.Raise vbObjectError, "XMLTransform(...)", m_xsl.parseError.reason
xslTransform = m_xml.transformNode(m_xsl)
Установить m_xsl = Ничего
Конечная функция
%>
<!--#include file="CUser.asp"-->
Код ASP создает объект CUser и заполняет данные, если они есть. Результирующий HTML затем создается посредством преобразования XSL с использованием DOM CUser. Преобразование заключено в функцию xslTransform. Также не забудьте сохранить полученный DOM CUser в скрытом элементе <INPUT>. Или вы можете сохранить DOM CUser в переменную сеанса и извлечь ее во время инициализации.
После завершения этой страницы вы можете создавать другие страницы на основе предыдущего скелетного кода. Теперь вы создали сценарий копирования и вставки для сбора данных. Самая красивая часть этого решения заключается в том, что весь вывод представляет собой чистый HTML, без каких-либо свойств или таблиц стилей, специфичных для браузера. А поскольку функциональность заключена в классы, вы можете использовать XSLT для создания макетов, и код выполняется довольно быстро.
-------------------------------------------------- ----------------------------------
Автор этой статьи: Филлип Перкинс — подрядчик компании Ajilon Consulting. Его опыт варьируется от управления оборудованием и клиент-серверных приложений до приложений внутренней сети.