| Суббота, 9 марта, 2013
Метки: ASP.NET MVC, ASP.NET Web API, Entity Framework, Knockout Комментарии: 0
Посмотрим, что у нас происходит в клиентской части приложения. Одностраничный шаблон использует комбинацию jQuery и Knockout.js для создания правильного интерактивного интерфейса. Библиотека Knockout.js помогает связывать HTML с данными, и реализует паттерн MVVM (Model-View-ViewModel).
Как только в объекте ViewModel изменяются данные, они сразу же синхронизируются с представлением (View). И еще события DOM элементов интерфейса связаны с функциями в ViewModel, которые отправляют AJAX-запросы на сервер.
В одностраничном шаблоне клиентская сторона состоит из трех уровней:
Эти файлы расположены в папке Scripts/app.
todo.datacontext.js реализует все AJAX-запросы к контроллерам Web API. (Кроме запросов авторизации, они находятся в другом файле – ajaxlogin.js)
В файле todo.model.js находятся объявления моделей для списков и элементов to-do. Там два класса: todoItem и todoList.
Большинство свойств моделей имеют тип "ko.observable". Для библиотеки Knockout, это значит, что значения таких свойств отслеживаютcя, и как только происходит изменение значения свойства, то сразу же обновляются связанные с ним HTML-элементы. Например todoItem имеет отслеживаемые свойства title и isDone:
self.title = ko.observable(data.title); self.isDone = ko.observable(data.isDone);
Также можно подписаться на изменения содержимого свойств. Например, класс todoItem вызывает событие saveChanges после любого изменения значений свойств title и isDone:
saveChanges = function () { return datacontext.saveChangedTodoItem(self); }; // Авто-сохранение после изменения значений свойств self.isDone.subscribe(saveChanges); self.title.subscribe(saveChanges);
Основная разметка HTML находится в файле Views/Home/Index/cshtml. Так как применяется связывание данных, HTML является просто шаблоном. Knockout реализует декларативное связывание. Элементы на странице связаны с данными при помощи атрибута "data-bind". Приведем простой пример из документации Knockout:
<p>There are <span data-bind="text: myItems().count"></span> items</p>
Здесь Knockout обновляет содержимое элемента span значением myItems.count(). Где бы не изменилось значение, Knockout обновляет HTML сразу.
В Knockout используются разные типы связывания. Ниже приведены связывания, которые применяются в одностраничном шаблоне:
Подделка межсайтовых запросов (Cross-Site Request Forgery - CSRF) – это вид атаки когда сайт злоумышленников отправляет запросы на ваш сайт, в то время, когда пользователь авторизован на нем. Чтобы предотвратить такие атаки в ASP.NET MVC используются специальные защитные маркеры (anti-forgery tokens), еще их можно назвать проверочные маркеры. Основная идея в том, что на страницу помещается случайным образом сгенерированный маркер и во время отправки данных на сервер этот маркер отправляется вместе с данными.
Проверочные маркеры работают, потому что страница злоумышленников не может прочитать меркеры из-за ограничений происхождения запросов, то есть документ расположенный на другом сайте не может прочитать содержимое документа вашего сайта.
ASP.NET MVC предоставляет встроенную поддержку для защитных маркеров с помощью класса AtniForgery и атрибута [ValidateAntiForgeryuToken]. К сожалению, такой поддержки нет в Web API, но в одностраничном шаблоне есть пользовательская реализация класса ValidateHttpAntiForgeryTokenAttribute, который расположен в папке Filters.
Copyright © CodeHint.ru 2013-2025 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля