Ошибка десериализации ScriptObject в Silverlight - PullRequest
1 голос
/ 26 февраля 2011

У меня есть элемент управления 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 мог правильно десериализовать его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...