Цель:
Реализуйте использование файла .cs в MasterPage для замены PageBase в проекте.
мотивация:
Мотивом для написания этой статьи послужила реконструкция проекта. В проекте архитектуры B/S .Net Framwork 2.0 использовались технологии PageBase и MasterPage. Было обнаружено, что при каждом доступе к странице страница обращается к PageBase и MasterPage одновременно, что не только приводит к снижению производительности, но и к снижению производительности. но может даже вызвать проблемы в будущем расширении и корректировке функций проекта. Скрытые логические ошибки.
Технические аспекты:
PageBase: технология, часто используемая в .Net Framework 1.1 для инкапсуляции одной и той же функциональности нескольких страниц. Класс PageBase.cs наследуется от класса System.Web.UI.Page. Веб-страницы в проекте наследуются от класса PageBase.cs. Путем переопределения метода инициализации страницы в базовом классе вызываются бизнес-функции в PageBase. такие как: параметры URL-адреса. Проверка, сохранение посещений и другие функции (конкретные методы реализации см. в официальном примере Microsoft duwamishi).
MasterPage: новая функция в .Net Framework 2.0. Физически она включает в себя два файла: файл .Master (разметка HTML) и файл .cs (код C#). Файл .Master реализует рисование слоя отображения, а файл .cs реализует определенные функции. Веб-страницы, наследуемые от MasterPage, могут наследовать содержимое слоя отображения в MasterPage. Чтобы нарисовать общий верхний и нижний колонтитул и настроить единый макет, MasterPage — хороший выбор.
Требования к моделированию:
Используйте технологию MasterPage для замены PageBase для реализации проверки параметров адресной строки.
Давайте дадим простое объяснение. Информация таблицы входа в базу данных следующая:
После входа в систему в адресной строке URL появляются следующие параметры:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
В это время пользователь вручную изменяет параметры в адресной строке URL-адреса следующим образом:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
Это считается незаконной операцией, и система автоматически вернется на страницу входа.
Первая итерация кода:
1. Обратитесь к традиционному методу PageBase:
Традиционный подход страницы:
общедоступный класс PageBase: System.Web.UI.Page
{
publicPageBase()
{
}
/**//// <сводка>
/// Метод входа
/// </сводка>
защищенная пустота Инициализация()
{
//Вставляем общую бизнес-логику
}
}
Веб-страница:
общедоступный частичный класс TestPage: PageBase
{
//Традиционный метод вызова PageBase
/**///// <сводка>
/// Переопределить метод OnPreInit() базового класса и вызвать общий метод проверки
/// </сводка>
/// <param name="e"></param>
защищенное переопределение void OnInit (eventargs e)
{
база.Инициализировать();
}
}
Следуйте этому подходу и переместите код из PageBase в MasterPage:
МастерПейдж.cs:
общедоступный частичный класс MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
если (!IsPostBack)
{
//Метод проверки вызова
Инициализировать();
}
}
}
Измените код на веб-странице, чтобы:
общедоступный частичный класс TestPage: System.Web.UI.Page
{
// Имитируем метод PageBase и вызываем метод в Master
/**//// <сводка>
/// Переопределить метод OnPreInit() базового класса и вызвать общий метод проверки
/// </сводка>
/// <param name="e"></param>
защищенное переопределение void OnInit (eventargs e)
{
// Получаем ссылку на главную страницу
МояMasterPage myMasterPage = (MyMasterPage)this.Master;
//Вызов общего метода проверки на главной странице
если (!IsPostBack)
{
мояМастерСтраница.Инициализировать();
}
}
} Замените метод Initialize() в MasterPage на метод из экземпляра тестового кода:
Шаг 1: Войдите в систему под именем пользователя zhangsan, вход будет успешным.
На странице показано, что Чжансан может войти в систему.
URL-адрес показывает:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Шаг 2. Вручную измените адресную строку URL-адреса следующим образом:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
На странице не будет отображаться приветствие входа в систему lisi, а произойдет возврат на страницу входа в систему.
Для размышления: Хотя функция реализована, все же есть некоторые неудовлетворительные ссылки:
1. Метод, вызываемый подклассом в Master, должен быть общедоступным методом;
2. Хотя нет необходимости изменять наследование веб-страницы, вам все равно придется механически скопировать, вставить и переопределить метод OnInit() базового класса.
Чтобы устранить эти затянувшиеся чувства, я начал:
Вторая итерация кода:
Измените код в MasterPage.cs:
общедоступный частичный класс MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
если (!IsPostBack)
{
//Метод проверки вызова
ПроверитьВойти();
}
}
/**//// <сводка>
/// Проверяем, легален ли доступ
/// </сводка>
частная пустота CheckLogin()
{
// Если число в URL-адресе или число в файле cookie
если (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Если число в URL-адресе не совпадает с числом в файле cookie, вернитесь на страницу входа.
иначе если (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}После реконструкции веб-страницу нельзя каким-либо образом изменить. MasterPage автоматически вызывает метод проверки в своем собственном методе Page_Load() и устанавливает для метода проверки значение Private, который может быть вызван только самим MasterPage для повышения безопасности. На данный момент код кажется идеальным. Тест:
Шаг 1: Войдите в систему под именем пользователя zhangsan.
Страница входа пользователя по-прежнему отображается.
Тест не пройден.
Используйте точки останова, чтобы отследить код и обнаружить, что проблема возникает во фрагменте кода в методе CheckLogin() в MasterPage.cs:
если (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
Поскольку страница входа наследуется от MasterPage, метод проверки в MasterPage.cs автоматически вызывается при загрузке страницы, а его собственные параметры не удовлетворяют методу string.IsNullOrEmpty(), поэтому происходит возврат на страницу входа. страница загружается снова. Вызывается метод проверки в базовом классе, образуя тем самым бесконечный цикл.
В технологии PageBase веб-страницы могут выборочно наследовать от PageBase, но в технологии MasterPage для получения единообразного эффекта уровня отображения избирательность веб-страниц по наследованию MasterPage очень низка, и нам не следует создавать такое же отображение, создавая новый, MasterPage без кода проверки используется для наследования веб-страниц, которым не требуется наследование функций базового класса. Этот метод явно неразумен. Для решения этой проблемы была запущена третья итерация:
Импортируйте файл конфигурации:
<?xml version="1.0"coding="utf-8" ?>
<страницы>
<тестовая страница>
<page title="TestPage" url="TestPage.aspx" Needvalidate="true"/>
<page title="Логин" url="Login.aspx" Needvalidate="false"/>
</testpage>
<страницы администратора>
<page title="Page1" url="~/Admin/Page1.aspx" Needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" Needvalidate="false"/>
</админстраницы>
</страницы>
Как видите, страницы, которые необходимо проверить, идентифицированы (needvalidate="true").
Создайте класс доступа к данным XML:
общедоступный класс XmlDAL
{
частная статическая строка filePath = string.Empty;
статический XmlDAL()
{
//Инициализируем путь к файлу конфигурации
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <сводка>
/// Получаем список страниц, которые необходимо проверить
/// </сводка>
/// <returns>Список страниц, требующих проверки</returns>
общедоступный статический IList<string> GetValidatePages()
{
Страницы IList<string> = новый List<string>();
// Если указанный файл конфигурации существует
если (System.IO.File.Exists(filePath))
{
пытаться
{
XmlDocument xmlDoc = новый XmlDocument();
xmlDoc.Load(путь к файлу);
// Получаем корневой узел файла конфигурации
XmlNode root = xmlDoc.DocumentElement;
строка xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Коллекция удобных узлов
foreach (узел XmlNode в nodeList)
{
Pages.Add(node.Attributes["title"].Value);
}
}
поймать (Исключение ex)
{
выдать новое исключение (ex.Message);
}
}
возврат страниц;
}
}
Выполните рефакторинг кода в MasterPage.cs и добавьте метод IsValidateNeeded(string url), чтобы определить, требует ли текущая страница проверки. Измените метод проверки:
общедоступный частичный класс MyMasterPage: System.Web.UI.MasterPage
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
если (!IsPostBack)
{
//Метод проверки вызова
ПроверитьВойти();
}
}
/**//// <сводка>
/// Проверяем, легален ли доступ
/// </сводка>
частная пустота CheckLogin()
{
// Определяем, требует ли текущая страница проверки
если (IsValidateNeeded(Request.RawUrl))
{
// Если число в URL-адресе или число в файле cookie
если (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Если число в URL-адресе не совпадает с числом в файле cookie, вернитесь на страницу входа.
иначе если (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**//// <сводка>
/// Проверяем, требует ли текущая страница проверки
/// </сводка>
/// <param name="currentPage">Имя текущей страницы</param>
/// <returns>Нужно ли проверять статус</returns>
частный bool IsValidateNeeded (строковый URL)
{
Bool isNeeded = ложь;
// Метод GetValidatePages() возвращает список страниц, которые необходимо проверить
Страницы IList<string> = XmlDAL.GetValidatePages();
IEnumerator<string> ie =pages.GetEnumerator();
в то время как (т.е.MoveNext())
{
// Если текущая страница требует проверки
если (url.Contains(т.е.Current))
//Возвращаемся в статус требующий проверки
возврат isNeeded = правда;
}
возврат isNeeded;
}
}
Чтобы проверить:
Шаг 1: Войдите в систему под именем пользователя zhangsan, вход будет успешным.
На странице показано, что Чжансан может войти в систему.
URL-адрес показывает:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Шаг 2. Вручную измените адресную строку URL-адреса следующим образом:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
На странице не будет отображаться приветствие входа в систему lisi, а произойдет возврат на страницу входа в систему.
На этом моя итерация кода завершается.
Загрузка кода: