2008-09-05 3 views
3

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

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

Я хотел бы предложить, что вы испускаете веб-ресурсы как динамический 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']; 

Надеется, что это помогает.

3

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

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

2

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

Основываясь на идеях Джейсона, я бы пересмотрел свой первоначальный код и пересмотрел некоторые из предложенных Джейсоном. Внедрите класс C# с двумя свойствами, img-ресурс «id» и свойство, которое содержит WebResourceUrl. Тогда, когда я отличаюсь от Jason, я предпочитаю использовать словарь, который я бы предложил использовать List, который затем вы можете сериализовать в JSON (используя DataContractJsonSerializer) и испускать JSON в качестве динамического скрипта, а не генерировать вручную javascript, используя строковый buider.

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

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

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

Смежные вопросы