SlideShare a Scribd company logo
Темы лекции: ASP.NET. MVC. Часть 5.
Практическое задание: ASP.NET. MVC.
Тренер: Игорь Шкулипа, к.т.н.
Разработка Веб-приложений на платформе
Microsoft .NET Framework.
Занятие 13
http://www.slideshare.net/IgorShkulipa 2
Бандлы
Материал из Википедии — свободной энциклопедии
Бандл (от англ. bundle — охапка, вязанка, пакет) в игровой индустрии —
комплект, состоящий из нескольких товаров, продаваемых как единое
целое.
Примеры бандлов:
Типичные и самые популярные бандлы — это так называемые игровые
комплекты:
• Игровая консоль + видеоигра
• Видеокарта (или материнская плата) + компьютерная игра
В таможенной практике понятие бандл используют для обозначения
упаковки (места) в контейнере. Тогда это может быть ящик (коробка),
поддон с товарами или связка. Обычно бандл — неделимая часть,
объединенная либо ящиком (пакетом, коробкой), либо закрепленная
на поддоне.
http://www.slideshare.net/IgorShkulipa 3
Бандлы и минификация
В ASP.NET MVC 4 была введена концепция бандлов, которая помогает организовать
файлы скриптов и стилей более эффективным путем для снижения издержек при
передаче клиенту.
В предыдущих версиях MVC мы могли стандартным образом подключать скрипты и
стили, например:
<head>
<meta name="viewport" content="width=device-width" />
<link type="text/css" rel="stylesheet" href="~/Content/Site.css" />
<script src="~/Scripts/jquery-1.7.1.js" type="text/javascript">
</script>
<title>Index</title>
</head>
Фреймворк MVC для настройки путей предлагает нам использовать URL-хелперы:
<head>
<meta name="viewport" content="width=device-width" />
<link type="text/css" rel="stylesheet"
href="@Url.Content("~/Content/Site.css")" />
<script
src="@Url.Content("~/Scripts/jquery-1.7.1.js")"
type="text/javascript"></script>
<title>Index</title>
</head>
http://www.slideshare.net/IgorShkulipa 4
Использование бандлов
Использование бандлов представляет совсем другой подход к использованию
скриптов и стилей. При создании нового проекта MVC4 по шаблону Basic или
Internet Application функциональность бандлов уже по умолчанию включается в
приложение.
<!DOCTYPE html>
<html>
<head>
...
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
@RenderBody()
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
В данном случае подключаются не конкретные скрипты и стили, а именно бандлы. С
помощью хелпера Styles.Render подключаются бандлы стилей, а с помощью
хелпера Scripts.Render. Эти хелперы принимают в качестве параметра имя
бандла.
http://www.slideshare.net/IgorShkulipa 5
BundleConfig.cs
По умолчанию проекты MVC4 (исключая проекты Empty) уже содержат регистрацию
бандлов - в файле BundleConfig.cs, который находится в папке App_Start.
http://www.slideshare.net/IgorShkulipa 6
Регистрация бандлов
Метод RegisterBundles добавляет все создаваемые бандлы в коллекцию bundles.
Объявление бандла выглядит следующим образом:
new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js").
В конструктор ScriptBundle передается виртуальный путь бандла. А с помощью метода
Include уже включаются в данный бандл конкретные файлы скриптов.
В выражении "~/Scripts/jquery-{version}.js" параметр {version} является
заменителем для любого символьного обозначения версии скрипта. Это очень
удобно, поскольку через некоторое время мы можем поменять версию библиотеки,
но при этом в коде нам ничего не придется менять, так как система уже
автоматически примет новую версию.
Выражение "~/Scripts/jquery.validate*" с помощью знака звездочки заменяет
остальную часть строки. Например, это выражение подключит в бандл сразу два
файла: jquery.validate.js и jquery.validate.unobtrusive.js (и их
минимизированные версии).
То же самое касается и создания бандлов стилей, только в этом случае используется
класс StyleBundle.
http://www.slideshare.net/IgorShkulipa 7
Регистрация бандлов
Однако само объявление бандлов в файле BundleConfig.cs еще не подключает
автоматически их в проект.
Для этого в файле Global.asax используется соответствующая директива:
public class MvcApplication1 : System.Web.HttpApplication
{
protected void Application_Start()
{
...
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Таким образом, мы и регистрируем бандлы для нашего приложения.
http://www.slideshare.net/IgorShkulipa 8
Минификация
Ключевым моментом концепции бандлов является минификация. Ее суть
состоит в том, что при развертывании приложения клиенту отдается не
полная, а минимизированная версия скриптов или стилей. За счет чего
экономятся ресурсы сервера, так как идет отдача файла с меньшим
объемом.
Таким образом, использование бандлов в проектах MVC4 повышает
эффективность веб-приложения.
Кроме того, для минимизации скриптов и стилей существует большое
количество утилит, которые можно дополнительно использовать.
Например, очень неплохая утилита по минимизации скриптов
Microsoft Ajax Minifier, позволяющая ужать скрипты в среднем до
50%, а иногда и больше.
http://www.slideshare.net/IgorShkulipa 9
Создание бандлов
public class BundleConfig {
public static void RegisterBundles(BundleCollection bundles) {
...
bundles.Add(
new ScriptBundle("~/bundles/myscripts").Include(
"~/Scripts/MyScripts/*.js"));
...
} } }
Выражение "~/Scripts/MyScripts/*.js" подключит в бандл все файлы js, которые есть
в каталоге Scripts/MyScripts.
Далее, в разметке подключаем новый бандл:
<body>
...
@Scripts.Render("~/bundles/myscripts")
...
</body>
</html>
И после этого бандл будет подключаться в приложение. При подключении бандлов не
стоит забывать об очередности: если у вас есть бандлы, файлы которых
зависят от других файлов других бандлов, например, от jquery, то, зависимые
бандлы надо подключать после основных.
http://www.slideshare.net/IgorShkulipa 10
CDN
Обычным делом на сегодняшний день является подключение различных
популярных библиотек javascript из сетей CDN.
Сеть доставки (и дистрибуции) контента (англ. Content Delivery
Network или Content Distribution Network, CDN) — географически
распределённая сетевая инфраструктура, позволяющая
оптимизировать доставку и дистрибуцию контента конечным
пользователям в сети Интернет.
Использование контент-провайдерами CDN способствует увеличению
скорости загрузки интернет-пользователями аудио-, видео-,
программного, игрового и других видов цифрового контента в точках
присутствия сети CDN.
http://www.slideshare.net/IgorShkulipa 11
Подключение библиотек из сетей CDN
Если мы хотим подключить, например, библиотеку jquery не со своего приложения, а
с какой-нибудь сети CDN, то мы должны включить поддержку CDN в бандлах в
файле BundleConfig.cs:
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles) {
...
bundles.UseCdn = true;
var jqueryCdnPath =
"http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js";
bundles.Add(new ScriptBundle("~/bundles/jquery",
jqueryCdnPath).Include(
"~/Scripts/jquery-{version}.js"));
...
} } }
Далее подключаем бандл обычным способом.
http://www.slideshare.net/IgorShkulipa 12
Real-time веб приложения
Основной отличительной способностью сервисов, которые можно назвать
real-time веб-приложениями является то, что они “ломают” привычную
нам всем модель работы в вебе – запрос-ответ, благодаря чему
пользователи видят обновление данных сразу же, как только они
появляются на сервере.
Если не знать, насколько далеко вперед шагнули технологии за
последние несколько лет, то можно предположить, что все подобные
приложения реализованы при помощи периодического опрашивания
сервера обычными Ajax-запросами, т.н. polling. Выглядит похоже, но
это не совсем так.
http://www.slideshare.net/IgorShkulipa 13
Способы реализации
Техника Описание Преимущества Недостатки
Polling Постоянный опрос
сервера Ajax-
запросами
+ простота реализации
+ поддержка во всех
современных браузерах
- задержка в
результатах
- при уменьшении
задержки
существенно
увеличивается
нагрузка на
сервер
Long
Polling
Ajax-запросы,
идущие один за
другим, но каждый
запрос держится
открытым в
течение нескольких
минут
+ сниженная нагрузка
на сервер по
сравнению с обычным
Polling
+ уменьшенный трафик
+ поддержка во всех
современных браузерах
- больше
одновременно
открытых
соединений, т.к.
каждый запрос
живет дольше
http://www.slideshare.net/IgorShkulipa 14
Способы реализации
Техника Описание Преимущества Недостатки
Server-Sent
Events
Новый стандарт
HTML5, работающий
поверх HTTP.
Позволяет
создавать
долгоживущее
соединение с
сервером, чтобы
сервер мог
отправлять данные
на клиент
+ нет
необходимости
постоянно
пересоединяться с
сервером
+ нет изменений на
стороне сервера,
поэтому работает на
всех современных
веб-серверах
- не
поддерживается в
IE (даже в IE10)
- работает только
в направлении
сервер –> клиент
(на сервер можно
отправлять
обычные Ajax
запросы)
WebSockets Новый протокол
(ws:// и wss://),
работающий поверх
TCP на одном
уровне с HTTP.
Позволяет
создавать
двустороннее
долгоживущее
соединение с
клиентом
+ нет
необходимости
постоянно
пересоединяться с
сервером
+ работает в
двустороннем
режиме
- поддерживается
не во всех веб-
серверах (IIS8)
- поддерживается
не во всех
браузерах (в IE7-
9, Android)
http://www.slideshare.net/IgorShkulipa 15
SignalR
Для упрощения работы с коммуникациями реального времени была
создана специальная библиотека под названием SignalR.
SignalR предоставляет простой API для создания функционала, который
позволяет вызывать функции JavaScript на стороне клиента из
серверного кода, написанного с помощью языков платформы .NET.
SignalR значительно упрощает работу с коммуникациями реального
времени. Библиотека обрабатывает все подключения и автоматически
рассылает сообщения всем подключенным клиентам, либо каким-
нибудь специфическим клиентам.
При этом SignalR является библиотекой, предназначенной не только для
использования в ASP.NET MVC. Ее также можно использовать и в веб-
формах, а также в консольных приложениях, десктопных приложения
и в WPF.
Фактически библиотека SignalR состоит из API серверной стороны,
который применяется в коде на C#, и из клиентских библиотек
JavaScript.
http://www.slideshare.net/IgorShkulipa 16
Ссылки
SignalR – это open source библиотека, которая находится на GitHub.
SignalR был придуман и реализован двумя разработчиками Microsoft:
Damian Edwards и David Fowler. В своих твиттерах они часто пишут
полезную информацию о SignalR и сообщают о новостях. Также David
Fowler ведет блог, в котором описывает все изменения в новых
версиях.
Ссылка на библиотеку:
https://github.com/SignalR
Ссылка на описание:
https://github.com/SignalR/SignalR/wiki
Ссылка на описание объекта connection:
https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client
http://www.slideshare.net/IgorShkulipa 17
Поддерживаемые платформы
SignalR поддерживается наиболее распространенными серверными платформами на
базе ОС Windows:
• Windows Server 2012
• Windows Server 2008 r2
• Windows 8
• Windows 7
• Windows Azure
Для работы на стороне сервера, также необходима .NET Framework 4.0 и выше.
Поддерживаемые клиентские платформы (браузеры):
• Microsoft Internet Explorer 8, 9 и 10. Версии Modern, Desktop и Mobile
• Mozilla Firefox: как на ОС Windows, так и на Mac ОС
• Google Chrome: как на ОС Windows, так и на Mac ОС
• Safari: как на ОС Windows, так и на Mac ОС
• Opera: ОС Windows
• Android-браузер
Также следует учитывать, что браузер должен поддерживать библиотеку
jQuery 1.6.4 или более поздние версии.
http://www.slideshare.net/IgorShkulipa 18
Модели SignalR
SignalR предоставляет разработчикам две модели: постоянные
подключения (Persistent Connection) и хабы (Hubs).
• Постоянные подключения (Persistent Connection API) представляют
разработчикам прямой доступ к низкоуровневому протоколу
коммуникации. Подключения в этой модели представляют конечную
точку, к которой подключаются клиенты, наподобие модели
подключений в WCF.
• Хабы же предоставляют протокол взаимодействия более высокого
уровня. Они представляют верхний слой над Persistent Connection
API и позволяют клиенту и серверу напрямую вызывать методы друг
друга.
Если вы будете работать с SignalR, то скорее всего будете
преимущественно использовать хабы, как более удобные
инструменты.
http://www.slideshare.net/IgorShkulipa 19
Архитектура
На сервере реализованы 2 вида API: низкоуровневый (Persistent
Connection API) и высокоуровневый (Hub API), причем Hub опирается
на Persistent Connection.
http://www.slideshare.net/IgorShkulipa 20
Транспортный уровень
SignalR – это абстракция над набором транспортов. Когда пользователь
открывает страницу, работающую с SignalR, браузер опрашивает
сервер на предмет поддержки разных транспортов и затем пытается
подсоединиться по самому оптимальному для данного случая
транспорту. Приоритет выглядит следующим образом:
http://www.slideshare.net/IgorShkulipa 21
Возможности SignalR
SignalR реализует следующие сценарии:
• клиент вызывает метод на сервере
• сервер вызывает метод на клиенте/клиентах
• передача состояния с клиента на сервер и обратно
• поддержка передачи сложных объектов (JSON сериализация)
• определение соединения, отсоединения и пересоединения
клиентов
• обращение к клиентам извне хаба при помощи специального
интерфейса (то есть любой код на сервере может оповестить
клиентов о событии)
• асинхронные сценарии
http://www.slideshare.net/IgorShkulipa 22
Добавление SignalR в проект
http://www.slideshare.net/IgorShkulipa 23
Пример. Чат.
Сначала создаем свой хаб ChatHub, который наследуется от класса Hub.
Далее определяем методы Send и Connect, которые предназначены для отправки
сообщений и добавления новых клиентов.
Формат вызова методов клиента:
• Вызов метода на всех клиентах: Clients.All.addMessage(name, message);
• Вызов метода только на текущем клиенте, который обратился к серверу:
Clients.Caller.addMessage(name, message);
• Вызов метода на всех клиентах, кроме того, который обратился к серверу:
Clients.Others.addMessage(name, message);
• Вызов метода только у клиента с определенным id:
Clients.Client(Context.ConnectionId).addMessage(name, message);
• Вызов метода на всех клиентах, кроме клиента с определенным id:
Clients.AllExcept(connectionId).addMessage(name, message);
• Вызов метода на всех клиентах указанной группы:
Clients.Group(groupName).addMessage(name, message);
• Вызов метода на всех клиентах указанной группы, за исключением клиента, у
которого id - connectionId: Clients.Group(groupName,
connectionId).addMessage(name, message);
• Вызов метода на всех клиентах указанной группы, за исключением
обратившегося к серверу клиента:
Clients.OthersInGroup(groupName).addMessage(name, message);
В зависимости от того, кому надо передать сообщение, можно выбрать один из
вариантов.
http://www.slideshare.net/IgorShkulipa 24
Пример. Хаб
public class ChatUser {
public string ID { get; set; }
public string Name { get; set; }
}
public class ChatHub: Hub {
static List<ChatUser> Users = new List<ChatUser>();
public void Send(string name, string message) {
Clients.All.addMessage(name, message);
Clients.All.addNewMessageToPage(name, message);
}
public void Connect(string userName) {
var id = Context.ConnectionId;
if (Users.Count(x => x.ID == id) == 0) {
Users.Add(new ChatUser { ID = id, Name = userName });
Clients.Caller.onConnected(id, userName, Users);
Clients.AllExcept(id).onNewUserConnected(id, userName);
}
}
}
http://www.slideshare.net/IgorShkulipa 25
Пример. Контроллер
public class HomeController : Controller {
public ActionResult Index() {
ViewBag.Message =
"Modify this template to jump-start your ASP.NET
MVC application.";
return View();
}
public ActionResult About() {
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact() {
ViewBag.Message = "Your contact page.";
return View();
}
}
http://www.slideshare.net/IgorShkulipa 26
Пример. Index.cshtml
@section scripts {
<script src="~/Scripts/jquery.signalR-1.1.4.min.js">
</script>
<script src="~/signalr/hubs">
</script>
<script src="~/Scripts/MyScripts/chatscript.js">
</script>
}
<div id="globalChatDiv">
</div>
<script>
$(document).ready(function () {
ChatEngine.ShowUI(“#globalChatDiv”);
ChatEngine.Run();
});
</script>
http://www.slideshare.net/IgorShkulipa 27
Пример. chatscript.js. Строки
ChatEngine = {
// Ссылка на ChatHub
ChatHub: $.connection.chatHub,
// Имя пользователя и ID
UserName: "",
UserID: "",
// Айдишники элементов интерфейса
GlobalChatDivID: "",
WelcomeHeaderID: "#welcomeHeader",
LoginDivID: "#loginDiv",
LoginTextBoxID: "#usernameText",
LoginButtonID: "#connectButton",
MainChatDivID: "#mainChatDiv",
InputMessageDivID: "#inputMessageDiv",
InputMessageTextBoxID: "#inputMessageText",
InputMessageButtonID: "#inputMessageButton",
MessagesDivID: "#messagesDiv",
MessagesListID: "#messagesList",
//Заголовки
MainHeaderText: "Chat",
ConnectButtonText: "Connect",
SendButtonText:"Send",
http://www.slideshare.net/IgorShkulipa 28
Пример. chatscript.js. Строки
// Сообщения
UserConnectedMessageText: "New User {0} Connected!",
UserDisconnectedMessageText: "User {0} Disonnected.",
WelcomeMessageText: "Welcome, {0}!",
NewUserConnectedMessageText: "New User {0} Connected!",
ConnectedToHubMessageText: "Connected to Hub!",
InputNameMessageText: "You must input the name!",
InputMessageMessageText: "You must input message!",
http://www.slideshare.net/IgorShkulipa 29
Пример. chatscript.js. Методы генерации элементов
HTML
// Генерация пользовательского интерфейса
GetWelcomeHeader: function () {
return String.format("<h2 id="{0}">{1}</h2>",
ChatEngine.WelcomeHeaderID.replace("#", ""),
ChatEngine.MainHeaderText);
},
GetLoginDiv: function () {
return String.format("<div id="{0}" class="container">" +
"<input type="text" id="{1}" />" +
"<input type="button" id="{2}" value="{3}" /></div>",
ChatEngine.LoginDivID.replace("#", ""),
ChatEngine.LoginTextBoxID.replace("#", ""),
ChatEngine.LoginButtonID.replace("#", ""),
ChatEngine.ConnectButtonText.replace("#", ""));
},
http://www.slideshare.net/IgorShkulipa 30
Пример. chatscript.js. Методы генерации элементов
HTML
GetMainChatDiv: function () {
return String.format(
"<div id="{0}"><div id="{1}" class="container">" +
"<input type="text" id="{2}" />" +
"<input type="button" id="{3}" value="{4}" /></div>" +
"<div id="{5}" class="container">" +
"<ul id="{6}"></ul></div></div>",
ChatEngine.MainChatDivID.replace("#", ""),
ChatEngine.InputMessageDivID.replace("#", ""),
ChatEngine.InputMessageTextBoxID.replace("#", ""),
ChatEngine.InputMessageButtonID.replace("#", ""),
ChatEngine.SendButtonText.replace("#", ""),
ChatEngine.MessagesDivID.replace("#", ""),
ChatEngine.MessagesListID.replace("#", ""));
},
// Добавление сообщения
AddMessageToLog: function (name, message) {
$(ChatEngine.MessagesListID).append(String.format(
"<li><strong>{0}</strong>: {1}</li>", name, message));
},
ShowUI: function (divID) {
ChatEngine.GlobalChatDivID = divID;
$(ChatEngine.GlobalChatDivID).html(ChatEngine.GetWelcomeHeader() +
ChatEngine.GetLoginDiv() + ChatEngine.GetMainChatDiv());
},
http://www.slideshare.net/IgorShkulipa 31
Пример. chatscript.js. Метод запуска движка чата
// Запуск "движка"
Run: function () {
$(ChatEngine.MainChatDivID).hide();
$(ChatEngine.LoginDivID).show();
ChatEngine.ChatHub.client.addMessage = ChatEngine.AddMessageToLog;
ChatEngine.ChatHub.client.onConnected = ConnectClient;
ChatEngine.ChatHub.client.onNewUserConnected = UserConnected;
ChatEngine.ChatHub.client.onUserDisconnected = UserDisconnected;
$(ChatEngine.LoginButtonID).click(LoginButtonClick);
$(ChatEngine.InputMessageButtonID).click(SendMessageButtonClick);
}
};
http://www.slideshare.net/IgorShkulipa 32
Пример. chatscript.js. Функции чата
function ConnectClient(id, userName, allUsers) {
$(ChatEngine.LoginDivID).hide();
$(ChatEngine.MainChatDivID).show();
ChatEngine.UserID = id;
ChatEngine.UserName = userName;
$(ChatEngine.WelcomeHeaderID).text(
String.format(ChatEngine.WelcomeMessageText, ChatEngine.UserName));
}
function UserConnected(id, name) {
alert(String.format(ChatEngine.UserConnectedMessageText, name));
}
function UserDisconnected(id, name) {
alert(String.format(UserDisconnectedMessageText, name));
}
http://www.slideshare.net/IgorShkulipa 33
Пример. chatscript.js. Функции чата
function LoginButtonClick() {
ChatEngine.UserName = $(ChatEngine.LoginTextBoxID).val();
if (ChatEngine.UserName.length > 0) {
$.connection.hub.start().done(function () {
ChatEngine.ChatHub.server.connect(ChatEngine.UserName);
alert(ChatEngine.ConnectedToHubMessageText);
});
}
else {
alert(ChatEngine.InputNameMessageText);
}
}
function SendMessageButtonClick() {
var message = $(ChatEngine.InputMessageTextBoxID).val();
if (message.length > 0) {
ChatEngine.ChatHub.server.send(ChatEngine.UserName, message);
$(ChatEngine.InputMessageTextBoxID).val("");
}
else {
alert(ChatEngine.InputMessageMessageText);
}
}
http://www.slideshare.net/IgorShkulipa 34
Пример. chatscript.js. Функция форматирования строк
String.format = function () {
// The string containing the format items (e.g. "{0}")
// will and always has to be the first argument.
var theString = arguments[0];
// start with the second argument (i = 1)
for (var i = 1; i < arguments.length; i++) {
// "gm" = RegEx options for Global search (more than one instance)
// and for Multiline search
var regEx = new RegExp("{" + (i - 1) + "}", "gm");
theString = theString.replace(regEx, arguments[i]);
}
return theString;
}
Взята отсюда http://jsfiddle.net/joquery/9KYaQ/
http://www.slideshare.net/IgorShkulipa 35
Результат
http://www.slideshare.net/IgorShkulipa 36
Результат
http://www.slideshare.net/IgorShkulipa 37
Результат
http://www.slideshare.net/IgorShkulipa 38
Лабораторная работа № 13.
Лабораторной работе по ASP.NET MVC добавить real-time активность (чат,
игра или т.п.).

More Related Content

PDF
C# Web. Занятие 12.
PDF
C# Web. Занятие 07.
PDF
JavaScript Базовый. Занятие 09.
PDF
JavaScript Базовый. Занятие 11.
PDF
C# Web. Занятие 04.
PDF
JavaScript Базовый. Занятие 07.
PDF
C# Web. Занятие 08.
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
C# Web. Занятие 12.
C# Web. Занятие 07.
JavaScript Базовый. Занятие 09.
JavaScript Базовый. Занятие 11.
C# Web. Занятие 04.
JavaScript Базовый. Занятие 07.
C# Web. Занятие 08.
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript

What's hot (20)

PDF
Внутреннее устройство и оптимизация бандла webpack
PDF
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
PDF
JavaScript Базовый. Занятие 10.
PDF
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
PDF
ДАМП 2015 Екатеринбург
PDF
Vue.js - реактивный фронтенд фреймворк для людей
PDF
The Old New ASP.NET
PDF
Как Webpack сделал меня счастливее
PDF
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
PDF
C# Web. Занятие 11.
PDF
Рендеринг может больше: vue.js vs React, Андрей Солодовников
PDF
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
PPTX
Webpack integration
PDF
Basis.js – «под капотом»
PDF
Knockoutjs на примере 2ГИС-Онлайн
PPTX
Web deployment
PPTX
jQuery. Введение и практика
PPTX
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
PDF
Лекция Android. БД SQLite, ContentProvider, Loader
PPT
Презентация jQuery
Внутреннее устройство и оптимизация бандла webpack
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JavaScript Базовый. Занятие 10.
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
ДАМП 2015 Екатеринбург
Vue.js - реактивный фронтенд фреймворк для людей
The Old New ASP.NET
Как Webpack сделал меня счастливее
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
C# Web. Занятие 11.
Рендеринг может больше: vue.js vs React, Андрей Солодовников
"VUE.JS как реакт с человеческим лицом" Дулецкий Вольдэмар, Evrone
Webpack integration
Basis.js – «под капотом»
Knockoutjs на примере 2ГИС-Онлайн
Web deployment
jQuery. Введение и практика
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
Лекция Android. БД SQLite, ContentProvider, Loader
Презентация jQuery
Ad

Viewers also liked (20)

PDF
Print Brochure 3NM v6
PDF
JavaScript Базовый. Занятие 06.
PPTX
Energías limpias
PPTX
Production diary 7
PDF
Modern Arabian Horse mag 2012 "Destination: Tulsa"
PDF
Happily_Disconnected
PDF
C++ Базовый. Занятие 04.
PDF
10 Reasons to Trademark Your Business
PPTX
Production diary 3
PDF
C# Web. Занятие 16.
PDF
16 FACTS ABOUT CHOCOLATE
PDF
Investors | How it works
PDF
C++ Базовый. Занятие 14.
PDF
PPC Masters February 2015
DOC
PRES Eve's Dream
PPTX
EE'13 - The Modern Marketer Can be Agile Too
PPTX
power point of extra material about eye trauma
PDF
Vijay Bhosekar_ Published Article_ Organic Agriculture
Print Brochure 3NM v6
JavaScript Базовый. Занятие 06.
Energías limpias
Production diary 7
Modern Arabian Horse mag 2012 "Destination: Tulsa"
Happily_Disconnected
C++ Базовый. Занятие 04.
10 Reasons to Trademark Your Business
Production diary 3
C# Web. Занятие 16.
16 FACTS ABOUT CHOCOLATE
Investors | How it works
C++ Базовый. Занятие 14.
PPC Masters February 2015
PRES Eve's Dream
EE'13 - The Modern Marketer Can be Agile Too
power point of extra material about eye trauma
Vijay Bhosekar_ Published Article_ Organic Agriculture
Ad

Similar to C# Web. Занятие 13. (20)

PPT
Node.js (RichClient)
PDF
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
PPTX
Менеджер пакетов NuGet
PDF
инструментарий
PDF
Frontend: Путешествие в мир модульных загрузчиков
PDF
C# Web. Занятие 09.
PDF
Доставка данных в реальном времени.
PPTX
Процесс разработки и тестирования с Docker + gitlab ci
PDF
Webpack для самых маленьких | Odessa Frontend Meetup #5
PDF
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
PDF
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
PPTX
Introduction into NuGet
PDF
Лекция #6. Введение в Django web-framework
PDF
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
PDF
NPM и модульная архитектура приложения
PDF
Backbone js
PPT
Drupal и возможности его применения
PDF
C# Desktop. Занятие 15.
PPTX
летняя школа д1 (домашнее задание)
PPTX
Как быть с большими сайтами на Word press
Node.js (RichClient)
Презентация «Bundle Transformer – инструмент для клиентской оптимизации в сре...
Менеджер пакетов NuGet
инструментарий
Frontend: Путешествие в мир модульных загрузчиков
C# Web. Занятие 09.
Доставка данных в реальном времени.
Процесс разработки и тестирования с Docker + gitlab ci
Webpack для самых маленьких | Odessa Frontend Meetup #5
2015-11-07 01 Виталий Кравцов. Webpack: человеческий подход к разработке веб ...
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Introduction into NuGet
Лекция #6. Введение в Django web-framework
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
NPM и модульная архитектура приложения
Backbone js
Drupal и возможности его применения
C# Desktop. Занятие 15.
летняя школа д1 (домашнее задание)
Как быть с большими сайтами на Word press

More from Igor Shkulipa (18)

PDF
Общие темы. Тема 03.
PDF
Общие темы. Тема 02.
PDF
Общие темы. Тема 01.
PDF
JavaScript Базовый. Занятие 05.
PDF
JavaScript Базовый. Занятие 08.
PDF
JavaScript Базовый. Занятие 01.
PDF
JavaScript Базовый. Занятие 04.
PDF
JavaScript Базовый. Занятие 03.
PDF
JavaScript Базовый. Занятие 02.
PDF
C# Web. Занятие 14.
PDF
C# Web. Занятие 15.
PDF
C# Web. Занятие 10.
PDF
C# Web. Занятие 05.
PDF
C# Web. Занятие 03.
PDF
C# Web. Занятие 06.
PDF
C# Web. Занятие 02.
PDF
C# Web. Занятие 01.
PDF
C# Desktop. Занятие 13.
Общие темы. Тема 03.
Общие темы. Тема 02.
Общие темы. Тема 01.
JavaScript Базовый. Занятие 05.
JavaScript Базовый. Занятие 08.
JavaScript Базовый. Занятие 01.
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 03.
JavaScript Базовый. Занятие 02.
C# Web. Занятие 14.
C# Web. Занятие 15.
C# Web. Занятие 10.
C# Web. Занятие 05.
C# Web. Занятие 03.
C# Web. Занятие 06.
C# Web. Занятие 02.
C# Web. Занятие 01.
C# Desktop. Занятие 13.

C# Web. Занятие 13.

  • 1. Темы лекции: ASP.NET. MVC. Часть 5. Практическое задание: ASP.NET. MVC. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 13
  • 2. http://www.slideshare.net/IgorShkulipa 2 Бандлы Материал из Википедии — свободной энциклопедии Бандл (от англ. bundle — охапка, вязанка, пакет) в игровой индустрии — комплект, состоящий из нескольких товаров, продаваемых как единое целое. Примеры бандлов: Типичные и самые популярные бандлы — это так называемые игровые комплекты: • Игровая консоль + видеоигра • Видеокарта (или материнская плата) + компьютерная игра В таможенной практике понятие бандл используют для обозначения упаковки (места) в контейнере. Тогда это может быть ящик (коробка), поддон с товарами или связка. Обычно бандл — неделимая часть, объединенная либо ящиком (пакетом, коробкой), либо закрепленная на поддоне.
  • 3. http://www.slideshare.net/IgorShkulipa 3 Бандлы и минификация В ASP.NET MVC 4 была введена концепция бандлов, которая помогает организовать файлы скриптов и стилей более эффективным путем для снижения издержек при передаче клиенту. В предыдущих версиях MVC мы могли стандартным образом подключать скрипты и стили, например: <head> <meta name="viewport" content="width=device-width" /> <link type="text/css" rel="stylesheet" href="~/Content/Site.css" /> <script src="~/Scripts/jquery-1.7.1.js" type="text/javascript"> </script> <title>Index</title> </head> Фреймворк MVC для настройки путей предлагает нам использовать URL-хелперы: <head> <meta name="viewport" content="width=device-width" /> <link type="text/css" rel="stylesheet" href="@Url.Content("~/Content/Site.css")" /> <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script> <title>Index</title> </head>
  • 4. http://www.slideshare.net/IgorShkulipa 4 Использование бандлов Использование бандлов представляет совсем другой подход к использованию скриптов и стилей. При создании нового проекта MVC4 по шаблону Basic или Internet Application функциональность бандлов уже по умолчанию включается в приложение. <!DOCTYPE html> <html> <head> ... @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> @RenderBody() @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) </body> </html> В данном случае подключаются не конкретные скрипты и стили, а именно бандлы. С помощью хелпера Styles.Render подключаются бандлы стилей, а с помощью хелпера Scripts.Render. Эти хелперы принимают в качестве параметра имя бандла.
  • 5. http://www.slideshare.net/IgorShkulipa 5 BundleConfig.cs По умолчанию проекты MVC4 (исключая проекты Empty) уже содержат регистрацию бандлов - в файле BundleConfig.cs, который находится в папке App_Start.
  • 6. http://www.slideshare.net/IgorShkulipa 6 Регистрация бандлов Метод RegisterBundles добавляет все создаваемые бандлы в коллекцию bundles. Объявление бандла выглядит следующим образом: new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"). В конструктор ScriptBundle передается виртуальный путь бандла. А с помощью метода Include уже включаются в данный бандл конкретные файлы скриптов. В выражении "~/Scripts/jquery-{version}.js" параметр {version} является заменителем для любого символьного обозначения версии скрипта. Это очень удобно, поскольку через некоторое время мы можем поменять версию библиотеки, но при этом в коде нам ничего не придется менять, так как система уже автоматически примет новую версию. Выражение "~/Scripts/jquery.validate*" с помощью знака звездочки заменяет остальную часть строки. Например, это выражение подключит в бандл сразу два файла: jquery.validate.js и jquery.validate.unobtrusive.js (и их минимизированные версии). То же самое касается и создания бандлов стилей, только в этом случае используется класс StyleBundle.
  • 7. http://www.slideshare.net/IgorShkulipa 7 Регистрация бандлов Однако само объявление бандлов в файле BundleConfig.cs еще не подключает автоматически их в проект. Для этого в файле Global.asax используется соответствующая директива: public class MvcApplication1 : System.Web.HttpApplication { protected void Application_Start() { ... BundleConfig.RegisterBundles(BundleTable.Bundles); } } Таким образом, мы и регистрируем бандлы для нашего приложения.
  • 8. http://www.slideshare.net/IgorShkulipa 8 Минификация Ключевым моментом концепции бандлов является минификация. Ее суть состоит в том, что при развертывании приложения клиенту отдается не полная, а минимизированная версия скриптов или стилей. За счет чего экономятся ресурсы сервера, так как идет отдача файла с меньшим объемом. Таким образом, использование бандлов в проектах MVC4 повышает эффективность веб-приложения. Кроме того, для минимизации скриптов и стилей существует большое количество утилит, которые можно дополнительно использовать. Например, очень неплохая утилита по минимизации скриптов Microsoft Ajax Minifier, позволяющая ужать скрипты в среднем до 50%, а иногда и больше.
  • 9. http://www.slideshare.net/IgorShkulipa 9 Создание бандлов public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { ... bundles.Add( new ScriptBundle("~/bundles/myscripts").Include( "~/Scripts/MyScripts/*.js")); ... } } } Выражение "~/Scripts/MyScripts/*.js" подключит в бандл все файлы js, которые есть в каталоге Scripts/MyScripts. Далее, в разметке подключаем новый бандл: <body> ... @Scripts.Render("~/bundles/myscripts") ... </body> </html> И после этого бандл будет подключаться в приложение. При подключении бандлов не стоит забывать об очередности: если у вас есть бандлы, файлы которых зависят от других файлов других бандлов, например, от jquery, то, зависимые бандлы надо подключать после основных.
  • 10. http://www.slideshare.net/IgorShkulipa 10 CDN Обычным делом на сегодняшний день является подключение различных популярных библиотек javascript из сетей CDN. Сеть доставки (и дистрибуции) контента (англ. Content Delivery Network или Content Distribution Network, CDN) — географически распределённая сетевая инфраструктура, позволяющая оптимизировать доставку и дистрибуцию контента конечным пользователям в сети Интернет. Использование контент-провайдерами CDN способствует увеличению скорости загрузки интернет-пользователями аудио-, видео-, программного, игрового и других видов цифрового контента в точках присутствия сети CDN.
  • 11. http://www.slideshare.net/IgorShkulipa 11 Подключение библиотек из сетей CDN Если мы хотим подключить, например, библиотеку jquery не со своего приложения, а с какой-нибудь сети CDN, то мы должны включить поддержку CDN в бандлах в файле BundleConfig.cs: public class BundleConfig { public static void RegisterBundles(BundleCollection bundles) { ... bundles.UseCdn = true; var jqueryCdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js"; bundles.Add(new ScriptBundle("~/bundles/jquery", jqueryCdnPath).Include( "~/Scripts/jquery-{version}.js")); ... } } } Далее подключаем бандл обычным способом.
  • 12. http://www.slideshare.net/IgorShkulipa 12 Real-time веб приложения Основной отличительной способностью сервисов, которые можно назвать real-time веб-приложениями является то, что они “ломают” привычную нам всем модель работы в вебе – запрос-ответ, благодаря чему пользователи видят обновление данных сразу же, как только они появляются на сервере. Если не знать, насколько далеко вперед шагнули технологии за последние несколько лет, то можно предположить, что все подобные приложения реализованы при помощи периодического опрашивания сервера обычными Ajax-запросами, т.н. polling. Выглядит похоже, но это не совсем так.
  • 13. http://www.slideshare.net/IgorShkulipa 13 Способы реализации Техника Описание Преимущества Недостатки Polling Постоянный опрос сервера Ajax- запросами + простота реализации + поддержка во всех современных браузерах - задержка в результатах - при уменьшении задержки существенно увеличивается нагрузка на сервер Long Polling Ajax-запросы, идущие один за другим, но каждый запрос держится открытым в течение нескольких минут + сниженная нагрузка на сервер по сравнению с обычным Polling + уменьшенный трафик + поддержка во всех современных браузерах - больше одновременно открытых соединений, т.к. каждый запрос живет дольше
  • 14. http://www.slideshare.net/IgorShkulipa 14 Способы реализации Техника Описание Преимущества Недостатки Server-Sent Events Новый стандарт HTML5, работающий поверх HTTP. Позволяет создавать долгоживущее соединение с сервером, чтобы сервер мог отправлять данные на клиент + нет необходимости постоянно пересоединяться с сервером + нет изменений на стороне сервера, поэтому работает на всех современных веб-серверах - не поддерживается в IE (даже в IE10) - работает только в направлении сервер –> клиент (на сервер можно отправлять обычные Ajax запросы) WebSockets Новый протокол (ws:// и wss://), работающий поверх TCP на одном уровне с HTTP. Позволяет создавать двустороннее долгоживущее соединение с клиентом + нет необходимости постоянно пересоединяться с сервером + работает в двустороннем режиме - поддерживается не во всех веб- серверах (IIS8) - поддерживается не во всех браузерах (в IE7- 9, Android)
  • 15. http://www.slideshare.net/IgorShkulipa 15 SignalR Для упрощения работы с коммуникациями реального времени была создана специальная библиотека под названием SignalR. SignalR предоставляет простой API для создания функционала, который позволяет вызывать функции JavaScript на стороне клиента из серверного кода, написанного с помощью языков платформы .NET. SignalR значительно упрощает работу с коммуникациями реального времени. Библиотека обрабатывает все подключения и автоматически рассылает сообщения всем подключенным клиентам, либо каким- нибудь специфическим клиентам. При этом SignalR является библиотекой, предназначенной не только для использования в ASP.NET MVC. Ее также можно использовать и в веб- формах, а также в консольных приложениях, десктопных приложения и в WPF. Фактически библиотека SignalR состоит из API серверной стороны, который применяется в коде на C#, и из клиентских библиотек JavaScript.
  • 16. http://www.slideshare.net/IgorShkulipa 16 Ссылки SignalR – это open source библиотека, которая находится на GitHub. SignalR был придуман и реализован двумя разработчиками Microsoft: Damian Edwards и David Fowler. В своих твиттерах они часто пишут полезную информацию о SignalR и сообщают о новостях. Также David Fowler ведет блог, в котором описывает все изменения в новых версиях. Ссылка на библиотеку: https://github.com/SignalR Ссылка на описание: https://github.com/SignalR/SignalR/wiki Ссылка на описание объекта connection: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client
  • 17. http://www.slideshare.net/IgorShkulipa 17 Поддерживаемые платформы SignalR поддерживается наиболее распространенными серверными платформами на базе ОС Windows: • Windows Server 2012 • Windows Server 2008 r2 • Windows 8 • Windows 7 • Windows Azure Для работы на стороне сервера, также необходима .NET Framework 4.0 и выше. Поддерживаемые клиентские платформы (браузеры): • Microsoft Internet Explorer 8, 9 и 10. Версии Modern, Desktop и Mobile • Mozilla Firefox: как на ОС Windows, так и на Mac ОС • Google Chrome: как на ОС Windows, так и на Mac ОС • Safari: как на ОС Windows, так и на Mac ОС • Opera: ОС Windows • Android-браузер Также следует учитывать, что браузер должен поддерживать библиотеку jQuery 1.6.4 или более поздние версии.
  • 18. http://www.slideshare.net/IgorShkulipa 18 Модели SignalR SignalR предоставляет разработчикам две модели: постоянные подключения (Persistent Connection) и хабы (Hubs). • Постоянные подключения (Persistent Connection API) представляют разработчикам прямой доступ к низкоуровневому протоколу коммуникации. Подключения в этой модели представляют конечную точку, к которой подключаются клиенты, наподобие модели подключений в WCF. • Хабы же предоставляют протокол взаимодействия более высокого уровня. Они представляют верхний слой над Persistent Connection API и позволяют клиенту и серверу напрямую вызывать методы друг друга. Если вы будете работать с SignalR, то скорее всего будете преимущественно использовать хабы, как более удобные инструменты.
  • 19. http://www.slideshare.net/IgorShkulipa 19 Архитектура На сервере реализованы 2 вида API: низкоуровневый (Persistent Connection API) и высокоуровневый (Hub API), причем Hub опирается на Persistent Connection.
  • 20. http://www.slideshare.net/IgorShkulipa 20 Транспортный уровень SignalR – это абстракция над набором транспортов. Когда пользователь открывает страницу, работающую с SignalR, браузер опрашивает сервер на предмет поддержки разных транспортов и затем пытается подсоединиться по самому оптимальному для данного случая транспорту. Приоритет выглядит следующим образом:
  • 21. http://www.slideshare.net/IgorShkulipa 21 Возможности SignalR SignalR реализует следующие сценарии: • клиент вызывает метод на сервере • сервер вызывает метод на клиенте/клиентах • передача состояния с клиента на сервер и обратно • поддержка передачи сложных объектов (JSON сериализация) • определение соединения, отсоединения и пересоединения клиентов • обращение к клиентам извне хаба при помощи специального интерфейса (то есть любой код на сервере может оповестить клиентов о событии) • асинхронные сценарии
  • 23. http://www.slideshare.net/IgorShkulipa 23 Пример. Чат. Сначала создаем свой хаб ChatHub, который наследуется от класса Hub. Далее определяем методы Send и Connect, которые предназначены для отправки сообщений и добавления новых клиентов. Формат вызова методов клиента: • Вызов метода на всех клиентах: Clients.All.addMessage(name, message); • Вызов метода только на текущем клиенте, который обратился к серверу: Clients.Caller.addMessage(name, message); • Вызов метода на всех клиентах, кроме того, который обратился к серверу: Clients.Others.addMessage(name, message); • Вызов метода только у клиента с определенным id: Clients.Client(Context.ConnectionId).addMessage(name, message); • Вызов метода на всех клиентах, кроме клиента с определенным id: Clients.AllExcept(connectionId).addMessage(name, message); • Вызов метода на всех клиентах указанной группы: Clients.Group(groupName).addMessage(name, message); • Вызов метода на всех клиентах указанной группы, за исключением клиента, у которого id - connectionId: Clients.Group(groupName, connectionId).addMessage(name, message); • Вызов метода на всех клиентах указанной группы, за исключением обратившегося к серверу клиента: Clients.OthersInGroup(groupName).addMessage(name, message); В зависимости от того, кому надо передать сообщение, можно выбрать один из вариантов.
  • 24. http://www.slideshare.net/IgorShkulipa 24 Пример. Хаб public class ChatUser { public string ID { get; set; } public string Name { get; set; } } public class ChatHub: Hub { static List<ChatUser> Users = new List<ChatUser>(); public void Send(string name, string message) { Clients.All.addMessage(name, message); Clients.All.addNewMessageToPage(name, message); } public void Connect(string userName) { var id = Context.ConnectionId; if (Users.Count(x => x.ID == id) == 0) { Users.Add(new ChatUser { ID = id, Name = userName }); Clients.Caller.onConnected(id, userName, Users); Clients.AllExcept(id).onNewUserConnected(id, userName); } } }
  • 25. http://www.slideshare.net/IgorShkulipa 25 Пример. Контроллер public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; return View(); } public ActionResult About() { ViewBag.Message = "Your app description page."; return View(); } public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); } }
  • 26. http://www.slideshare.net/IgorShkulipa 26 Пример. Index.cshtml @section scripts { <script src="~/Scripts/jquery.signalR-1.1.4.min.js"> </script> <script src="~/signalr/hubs"> </script> <script src="~/Scripts/MyScripts/chatscript.js"> </script> } <div id="globalChatDiv"> </div> <script> $(document).ready(function () { ChatEngine.ShowUI(“#globalChatDiv”); ChatEngine.Run(); }); </script>
  • 27. http://www.slideshare.net/IgorShkulipa 27 Пример. chatscript.js. Строки ChatEngine = { // Ссылка на ChatHub ChatHub: $.connection.chatHub, // Имя пользователя и ID UserName: "", UserID: "", // Айдишники элементов интерфейса GlobalChatDivID: "", WelcomeHeaderID: "#welcomeHeader", LoginDivID: "#loginDiv", LoginTextBoxID: "#usernameText", LoginButtonID: "#connectButton", MainChatDivID: "#mainChatDiv", InputMessageDivID: "#inputMessageDiv", InputMessageTextBoxID: "#inputMessageText", InputMessageButtonID: "#inputMessageButton", MessagesDivID: "#messagesDiv", MessagesListID: "#messagesList", //Заголовки MainHeaderText: "Chat", ConnectButtonText: "Connect", SendButtonText:"Send",
  • 28. http://www.slideshare.net/IgorShkulipa 28 Пример. chatscript.js. Строки // Сообщения UserConnectedMessageText: "New User {0} Connected!", UserDisconnectedMessageText: "User {0} Disonnected.", WelcomeMessageText: "Welcome, {0}!", NewUserConnectedMessageText: "New User {0} Connected!", ConnectedToHubMessageText: "Connected to Hub!", InputNameMessageText: "You must input the name!", InputMessageMessageText: "You must input message!",
  • 29. http://www.slideshare.net/IgorShkulipa 29 Пример. chatscript.js. Методы генерации элементов HTML // Генерация пользовательского интерфейса GetWelcomeHeader: function () { return String.format("<h2 id="{0}">{1}</h2>", ChatEngine.WelcomeHeaderID.replace("#", ""), ChatEngine.MainHeaderText); }, GetLoginDiv: function () { return String.format("<div id="{0}" class="container">" + "<input type="text" id="{1}" />" + "<input type="button" id="{2}" value="{3}" /></div>", ChatEngine.LoginDivID.replace("#", ""), ChatEngine.LoginTextBoxID.replace("#", ""), ChatEngine.LoginButtonID.replace("#", ""), ChatEngine.ConnectButtonText.replace("#", "")); },
  • 30. http://www.slideshare.net/IgorShkulipa 30 Пример. chatscript.js. Методы генерации элементов HTML GetMainChatDiv: function () { return String.format( "<div id="{0}"><div id="{1}" class="container">" + "<input type="text" id="{2}" />" + "<input type="button" id="{3}" value="{4}" /></div>" + "<div id="{5}" class="container">" + "<ul id="{6}"></ul></div></div>", ChatEngine.MainChatDivID.replace("#", ""), ChatEngine.InputMessageDivID.replace("#", ""), ChatEngine.InputMessageTextBoxID.replace("#", ""), ChatEngine.InputMessageButtonID.replace("#", ""), ChatEngine.SendButtonText.replace("#", ""), ChatEngine.MessagesDivID.replace("#", ""), ChatEngine.MessagesListID.replace("#", "")); }, // Добавление сообщения AddMessageToLog: function (name, message) { $(ChatEngine.MessagesListID).append(String.format( "<li><strong>{0}</strong>: {1}</li>", name, message)); }, ShowUI: function (divID) { ChatEngine.GlobalChatDivID = divID; $(ChatEngine.GlobalChatDivID).html(ChatEngine.GetWelcomeHeader() + ChatEngine.GetLoginDiv() + ChatEngine.GetMainChatDiv()); },
  • 31. http://www.slideshare.net/IgorShkulipa 31 Пример. chatscript.js. Метод запуска движка чата // Запуск "движка" Run: function () { $(ChatEngine.MainChatDivID).hide(); $(ChatEngine.LoginDivID).show(); ChatEngine.ChatHub.client.addMessage = ChatEngine.AddMessageToLog; ChatEngine.ChatHub.client.onConnected = ConnectClient; ChatEngine.ChatHub.client.onNewUserConnected = UserConnected; ChatEngine.ChatHub.client.onUserDisconnected = UserDisconnected; $(ChatEngine.LoginButtonID).click(LoginButtonClick); $(ChatEngine.InputMessageButtonID).click(SendMessageButtonClick); } };
  • 32. http://www.slideshare.net/IgorShkulipa 32 Пример. chatscript.js. Функции чата function ConnectClient(id, userName, allUsers) { $(ChatEngine.LoginDivID).hide(); $(ChatEngine.MainChatDivID).show(); ChatEngine.UserID = id; ChatEngine.UserName = userName; $(ChatEngine.WelcomeHeaderID).text( String.format(ChatEngine.WelcomeMessageText, ChatEngine.UserName)); } function UserConnected(id, name) { alert(String.format(ChatEngine.UserConnectedMessageText, name)); } function UserDisconnected(id, name) { alert(String.format(UserDisconnectedMessageText, name)); }
  • 33. http://www.slideshare.net/IgorShkulipa 33 Пример. chatscript.js. Функции чата function LoginButtonClick() { ChatEngine.UserName = $(ChatEngine.LoginTextBoxID).val(); if (ChatEngine.UserName.length > 0) { $.connection.hub.start().done(function () { ChatEngine.ChatHub.server.connect(ChatEngine.UserName); alert(ChatEngine.ConnectedToHubMessageText); }); } else { alert(ChatEngine.InputNameMessageText); } } function SendMessageButtonClick() { var message = $(ChatEngine.InputMessageTextBoxID).val(); if (message.length > 0) { ChatEngine.ChatHub.server.send(ChatEngine.UserName, message); $(ChatEngine.InputMessageTextBoxID).val(""); } else { alert(ChatEngine.InputMessageMessageText); } }
  • 34. http://www.slideshare.net/IgorShkulipa 34 Пример. chatscript.js. Функция форматирования строк String.format = function () { // The string containing the format items (e.g. "{0}") // will and always has to be the first argument. var theString = arguments[0]; // start with the second argument (i = 1) for (var i = 1; i < arguments.length; i++) { // "gm" = RegEx options for Global search (more than one instance) // and for Multiline search var regEx = new RegExp("{" + (i - 1) + "}", "gm"); theString = theString.replace(regEx, arguments[i]); } return theString; } Взята отсюда http://jsfiddle.net/joquery/9KYaQ/
  • 38. http://www.slideshare.net/IgorShkulipa 38 Лабораторная работа № 13. Лабораторной работе по ASP.NET MVC добавить real-time активность (чат, игра или т.п.).