Динамическая передача параметров с хоста ASPX на выделенный код Silverlight 4 xaml - PullRequest
1 голос
/ 05 августа 2010

Хорошо, во-первых, я новичок в Silverlight и ищу кого-то, кто предоставит руководство относительно того, является ли следующее решение предписанным способом.

Вчера я начал работать над проблемой, которая на первый взгляд казалась довольно простой и понятной. Мне нужно передать несколько параметров из кодового компонента ASPX, в котором размещен тег объекта Silverlight, в код одного или нескольких пользовательских элементов управления Silverlight в размещенном приложении Silverlight.

Итак, после некоторых исследований, это базовое решение, которое я разработал ...

Я обнаружил, что атрибут можно добавить в тег объекта с именем initParams, к этому атрибуту можно добавить список имен параметров и значений, разделенных запятыми. Вот так ...

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SampleApplication.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40624.0" />
<param name="autoUpgrade" value="true" />
<param name="initParams" value='DealerId=17' />
</object>

Это нормально, за исключением того, что параметр DealerId в основном жестко запрограммирован в теге объекта и не очень полезен.

Следующее, что я сделал, это заменил этот тег объекта на литеральный элемент управления и установил для текста литерального элемента управления внутри кода страницы значение StringBuilder (где я создал полный тег объекта вместе с динамически добавляя правильное значение DealerId). В следующем примере DealerId жестко запрограммирован, но вы поняли идею.

var sb = new StringBuilder();
            sb.Append(@"<object data=""data:application/x-silverlight-2,"" type=""application/x-silverlight-2"" width=""90%"" height=""80%"">");
            sb.Append(@"<param name=""source"" value=""ClientBin/Ascend.SilverlightViewer.xap""/>");
            sb.Append(@"<param name=""onError"" value=""onSilverlightError"" />");
            sb.Append(@"<param name=""background"" value=""white"" />");
            sb.Append(@"<param name=""minRuntimeVersion"" value=""3.0.40624.0"" />");
            sb.Append(@"<param name=""autoUpgrade"" value=""true"" />");
            sb.Append(@"<param name=""initParams"" value='");
            sb.Append(@"ServiceUrl=");
            sb.AppendFormat("http://{0}{1}", Request.Url.Authority, ResolveUrl("~/ReportService.svc"));
            sb.Append(@",DebugMode=Full");
            sb.AppendFormat(@",DealerId={0}' />", 40);
            sb.Append(@"</object>");

            litObjectTag.Text = sb.ToString();

Моя цель, если этот первоначальный проект является нормальным, состоит в том, чтобы затем перетащить создание этого тега объекта в серверный элемент управления, у которого будет свойство DealerId, которое, в свою очередь, будет установлено в пределах кода хоста.

На этом этапе у меня есть хост, динамически добавляющий значения параметров в атрибут initParams тега объекта, следующий шаг - получить эти значения и использовать их в размещенном приложении Silverlight.

Я нашел несколько статей, чтобы помочь с этим; Я создаю публичный словарь в App.xaml.cs и устанавливаю его в событии Application_Startup ...

public IDictionary<string, string> InitConfigDictionary;

private void Application_Startup(object sender, StartupEventArgs e)
{
  InitConfigDictionary = e.InitParams;
  this.RootVisual = new MainPage();
}

Теперь я могу получить доступ к этому общедоступному словарю из выделенного кода любого пользовательского элемента управления .xaml, например ...

App app = (Приложение) Application.Current; var dealerId = app.InitConfigDictionary ["DealerId"];

Этот дизайн прекрасно работает, я просто ищу руководство, так как я новичок в Silverlight. Еще раз, реализация работает, но кажется, что нужно проделать большую работу, чтобы передать динамическое значение из хоста в файлы .xaml.

Поскольку я новичок в Silverlight, я надеюсь, что кто-то с большим опытом может сказать, что либо:

а) Патрик, ты безумен, почему ты проходишь всю эту работу, когда явно в Silverlight ты достигнешь этого с помощью «xxxxxx».

б) Да, Патрик, это перетаскивание, но этот дизайн в основном то, что вы должны делать в Silverlight.

Еще раз, любое руководство, которое может быть предоставлено, будет высоко оценено, спасибо. - PWK

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Тебе не нужно разбирать все, что я верю.Вы можете вызвать код из следующего способа со страницы aspx

<param name="initParams" value="<%= BuildInitParams()%>" />

И в вашем коде сзади есть

    public string BuildInitParams()
    {
        //Dynamically build the string here;
    }

надеюсь, что это поможет.

Rakibul

0 голосов
/ 01 августа 2012

Это может быть немного старым вопросом, но я помню, что у меня была похожая проблема, и я просто придумал какое-то разрешение, по крайней мере, для своих нужд.

Сначала я добавил код позади страницыдля моей страницы .aspx (хостинг моего приложения Silverlight).Раньше я жестко кодировал свои пары ключ / значение в поле initParams, например:

<param id="initParams" runat="server" name="initParams" value="param1=foo,param2=bar" />

Однако я хотел найти решение, в котором я мог бы сохранить эти значения в файле конфигурации.Поэтому я добавил раздел в свой конфигурационный файл со значениями, которые я хотел.Я очистил атрибут value в теге param на странице aspx, и вместо этого я динамически извлекаю элементы из и динамически помещаю их в атрибут value во время выполнения, используя Page_Load на странице ASPX:

protected void Page_Load(object sender, EventArgs e)
        {
            initParams.Attributes["value"] += "userId=" + Page.User.Identity.Name;
            foreach (var key in ConfigurationManager.AppSettings.AllKeys)
            {
                initParams.Attributes["value"] += "," + key + "=" + ConfigurationManager.AppSettings[key];
            }
        }

Оттуда, на странице App.xaml.cs приложения Silverlight, я добавил этот код:

private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new MainPage();
            // Take parameters and store them in application resources
            foreach (var data in e.InitParams)
            {
                this.Resources.Add(data.Key, data.Value);
            }
        }

Как только приложение Silverlight загружается, оно сохраняет их в объекте Resources, а затем вкод, когда это необходимо, я могу ссылаться на них, используя:

Application.Current.Resources["param1"].ToString();

Мое конкретное использование для этого было адресом конечной точки для URL службы.Я хотел, чтобы это было чем-то, что я мог бы изменить в конфигурационном файле, чтобы другие ИТ-специалисты могли обновлять адрес службы без необходимости перестраивать / повторно развертывать.Я мог бы жестко запрограммировать это в атрибуте значения initParams страницы ASPX, но внесение изменений не является интуитивно понятным или простым для чтения.Я предпочитаю подход с использованием файла конфигурации.

...