Ссылки на встроенные ресурсы из других ресурсов в c # - PullRequest
3 голосов
/ 05 сентября 2008

В свое веб-приложение я включаю все свои скрипты Java в виде js-файлов, которые являются встроенными ресурсами в сборку, и добавляю их на страницу, используя ClientScriptManager.GetWebResourceUrl(). Однако в некоторых моих js-файлах есть ссылки на другие статические ресурсы, такие как URL-адреса изображений. Я хотел бы также сделать эти ресурсы для сборки. Есть ли способ токенизировать ссылку на ресурс? например,

this.drophint = document.createElement('img');
this.drophint.src = '/_layouts/images/dragdrophint.gif';

Может стать чем-то вроде:

this.drophint = document.createElement('img');
this.drophint.src = '{resource:assembly.location.dragdrophint.gif}';

Ответы [ 3 ]

3 голосов
/ 06 сентября 2008

Меня не особо заботит точная реализация @ Jon предполагает, но идея этого обоснована, и я бы согласился, что испускать их было бы хорошо ,

Немного лучшая реализация, хотя все это в некоторой степени субъективно, заключалась бы в создании серверной модели (читай: C # class (s)), которая представляет этот словарь (или просто использует экземпляр Dictionary ) и сериализовать это в буквальную нотацию объектов JavaScript. Таким образом, вы не имеете дело со взломом строк, который вы видите в примере Джона (если это вас беспокоит).

3 голосов
/ 06 сентября 2008

Я бы посоветовал вам создавать веб-ресурсы в виде динамического ассоциативного массива JavaScript.

Код серверной стороны:

StringBuilder script = new StringBuilder();
script.Append("var imgResources = {};");
script.AppendFormat("imgResources['{0}'] = '{1}';", 
    "drophint", 
    Page.ClientScript.GetWebResourceUrl(Page.GetType(), "assembly.location.dragdrophint.gif"));
script.AppendFormat("imgResources['{0}'] = '{1}';", 
    "anotherimg", 
    Page.ClientScript.GetWebResourceUrl(Page.GetType(), "assembly.location.anotherimg.gif"));

Page.ClientScript.RegisterClientScriptBlock(
    Page.GetType(),
    "imgResources",
    script.ToString(), 
    true);

Тогда ваш код на стороне клиента будет выглядеть так:

this.drophint = document.createElement('img');
this.drophint.src = imgResources['drophint'];
this.anotherimg = document.createElement('img');
this.anotherimg.src = imgResources['anotherimg'];

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

2 голосов
/ 06 сентября 2008

Я согласен с оценкой Джейсоном первоначального решения, которое я предложил, оно определенно может быть улучшено. Мое решение представляет менталитет javascript в старшей школе (читай, до появления ajax и json). Всегда есть лучшие способы решения проблемы, что является одной из причин, почему stackoverflow такой крутой. В целом мы лучше умеем программировать, чем кто-либо из нас в одиночку.

Основываясь на идеях Джейсона, я бы пересмотрел свой исходный код и пересмотрел некоторые из предложенных Джейсоном. Реализуйте класс C # с двумя свойствами: идентификатором ресурса img и свойством, содержащим WebResourceUrl. Затем, в чем я немного отличаюсь от Jason, это то, что вместо использования словаря я бы предложил использовать список, который затем можно сериализовать в JSON (используя DataContractJsonSerializer ) и выдавать JSON в качестве динамического сценарий, вместо того, чтобы вручную генерировать JavaScript, используя строку Buider.

Почему список? Я думаю, вы можете обнаружить, что словари при сериализации в json, по крайней мере, с использованием DataContractJsonSerializer (fyi доступен только с платформой 3.5, с фреймворком 2.0 или 3.0, который вам нужно подключить к aspnet ajax и использовать json serializer), являются немного более громоздким для работы, чем, как список будет сериализован. Хотя это субъективно.

Есть и последствия с вашим клиентским кодом. Теперь на стороне клиента у вас будет массив сериализованных экземпляров json MyImageResourceClass. Вам нужно будет перебирать этот массив, создавая теги img по ходу работы.

Надеемся, что эти идеи и предложения помогут вам начать работу! И, несомненно, есть и другие решения. Мне интересно посмотреть, что из этого выйдет.

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