Написание сценариев для веб-страницы с помощью .NET

32

Последний прием с элементом управления WebBrowser, который будет показан, представляет нечто более интригующее — возможность реагировать на события веб-страницы в своем коде Windows.

Элемент управления WebBrowser существенно упрощает решение этой задачи. Первым шагом является создание класса, который будет получать сообщения от кода JavaScript. Чтобы этот класс мог работать со сценариями, в его объявление должен быть обязательно добавлен атрибут ComVisible (из пространства имен System.Runtime.InteropServices):

[ComVisible(true)]
public class HtmlBridge
{
   public void WebClick(string source)
   {
      MessageBox.Show("Received: " + source);
   }
}

Далее необходимо зарегистрировать экземпляр этого класса с WebBrowser. Делается это путем установки свойства WebBrowser.ObjectForScripting:

public MainWindow()
{
   InitializeComponent();
   webBrowser.Navigate("file:///" + System.IO.Path.Combine(Path.GetDirectoryName(Application.ResourceAssembly.Location), 
      "sample.htm"));
   webBrowser.ObjectForScripting = new Html Bridge();
}

Теперь демонстрационная веб-страница HTML сможет вызывать любой общедоступный метод класса HtmlBridge, в том числе HtmlBridge.WebClick(). Внутри веб-страницы используется код JavaScript для инициирования события.

Трюк кроется в объекте window.external, который представляет связанный объект .NET. С помощью этого объекта указывается метод, который должен вызываться; например, для вызова общедоступного метода по имени HelloWorld в объекте .NET используемый синтаксис должен выглядеть как window.external.HelloWorld().

При использовании JavaScript для инициирования события из веб-страницы, удостоверьтесь, что класс не содержит общедоступных методов, которые не имеют отношения к вебдоступу. Теоретически злоумышленник может найти исходный код HTML и изменить его, вызвав какой-то другой метод, отличный от того, который был предусмотрен разработчиком. В идеале для обеспечения безопасности в классе, способном работать со сценариями, должны содержаться только методы, имеющие отношение к веб-доступу.

Для встраивания команды JavaScript в веб-страницу сначала необходимо выбрать, на какое событие веб-страницы реагировать. Большинство HTML-элементов поддерживает относительно немного событий, наиболее полезные из которых описаны ниже:

Для написания команды JavaScript, способной реагировать на одно из этих событий, необходимо добавить атрибут с таким именем к дескриптору элемента. Например, если есть следующий дескриптор изображения:

<img border="0" id="imgl" src="buttonC.jpg" height="20" width="100">

можно добавить атрибут onClick, который обеспечит вызов метода HelloWorld() в связанном классе .NET при каждом выполнении щелчка на этом изображении.

На рисунке ниже показано приложение, которое объединяет в себе все описанные выше аспекты. В этом приложении элемент управления WebBrowser отображает локальный HTML-файл, содержащий четыре кнопки, каждая из которых представляет собой графическое изображение. Но когда пользователь щелкает на кнопке, изображение использует атрибут onClick для запуска метода HtmlBridge.WebClick():

HTML-меню, которое обращается к коду .NET
Пройди тесты
Лучший чат для C# программистов