У меня есть элемент управления Silverlight на странице aspx. Пользователь может выбрать один или несколько аккаунтов для фильтрации некоторых данных, которые я отображаю в элементе управления SL. Когда они нажимают кнопку, открывается страница aspx «lookup», которая отображает список учетных записей для пользователя и позволяет им проверять те, которые они хотят включить. Затем пользователь нажимает «Вставить», и эти данные передаются в элемент управления Silverlight на начальной странице.
Я наткнулся на одну трубку, которая все еще не дает мне покоя. Страница поиска учетной записи создает массив объектов учетной записи, а затем передает его на начальную страницу следующим образом (JavaScript):
var accounts = [{ ID: 1, Name: "Foo"}, { ID: 2, Name: "Bar" }]; // test data
if (window.opener && window.opener.accountsInserted) {
window.opener.accountsInserted(accounts); // pass array of objects to opener
}
На странице, которая открывает всплывающее окно (на той же странице, где находится элемент управления Silverlight), я принимаю этот массив и передаю его объекту Silverlight (JavaScript):
function accountsInserted(accounts) {
silverLightControl.Content.Scriptables.SetAccounts(accounts);
}
Приведенный выше код выдаст ошибку при попытке вызвать SetAccounts. Управляемый код в элементе управления Silverlight выполняется, но выдает исключение типа «не удается преобразовать ScriptObject в Account []» - это ошибка преобразования / приведения. Я подключил отладчик и подтвердил, что у него есть проблема с десериализацией массива объектов, переданных в параметр account. Вот управляемый код, который выполняется (VB .NET в элементе управления Silverlight):
<ScriptableType()>
Public Class Scriptables
<ScriptableMember()>
Public Sub SetAccounts(ByVal accounts As ScriptObject)
Dim myAccounts As Account() = accounts.ConvertTo(Of Account())() ' this line throws exception
End Sub
End Class
Public Class Account
Public Property ID As Integer
Public Property Name As String
End Class
Кстати, я регистрируюсь в экземпляре Scriptables
как объект сценариев в элементе управления Silverlight: HtmlPage.RegisterScriptableObject("Scriptables", mScriptables)
Теперь, прежде чем вы все начнете давать мне идеи о том, что можно попробовать, я пробежался по гамме. Я обнаружил, что это работает на странице, на которой размещен элемент управления Silverlight, я копирую массив accounts
в другой массив (определенный на странице, на котором размещается элемент управления Silverlight), и это на самом деле работает:
function accountsInserted(accounts) {
var newAccounts = [];
if (accounts) {
for (var i = 0; i < accounts.length; i++); {
newAccounts[i] = accounts[i];
}
}
silverLightControl.Content.Scriptables.SetAccounts(newAccounts);
}
Что здесь происходит? Почему я должен скопировать массив в другой массив, чтобы элемент управления Silverlight мог правильно десериализовать его?