2010-10-21 5 views
0

Поскольку он стоит прямо сейчас, у меня есть буквальный контроль на моей странице. В моем коде, я использую StringBuilder для генерации некоторого JavaScript. Также на этой странице у меня есть коллекция предметов. Я хочу сделать это для каждого элемента в моей коллекции элементов, генерировать мой литерал, который по сути будет генерировать мой JavaScript. Вот пример моего кода. Я в порядке с чем-то другим, но мне просто нужно сгенерировать указанный JavaScript для каждого элемента в коллекции, и я не уверен, как это сделать.Создание литерала для каждого элемента в коллекции предметов

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
sb.Append("<script type='text/javascript'>"); 
sb.Append("mboxCreate(\"product_productpage_rec\","); 
sb.Append("\"entity.id=" + _prodID + "\","); 
sb.Append("\"entity.categoryId=" + _categoryID + "\","); 
sb.Append("\"entity.name=" + _prod.Title + "\","); 
sb.Append("\"entity.pageURL=" + Request.Url.ToString() + "\","); 
//The following value has been taken from the productImageControl code behind. 
//Might have to refactor in future as a property of the image control. 
string filename = AppSettingsManager.Current.ProductImagePathLarge + _prod.ActiveProductItemCollection[0].Sku + AppSettingsManager.Current.ProductImageExtension; 
sb.Append("\"entity.thumbnailURL=" + filename + "\","); 
sb.Append("\"entity.inventory=" + _prod.ActiveProductItemCollection.Count + "\","); 
sb.Append("\"entity.value=" + _prod.ActiveProductItemCollection[0].ActualPrice + "\","); 
sb.Append("\"entity.ProductItemID=" + prodItem.Id + "\","); 
sb.Append("\"entity.addToCartImg=~/Images/Buttons/btn_AddToCartFlat.gif\");<"); 
//The last line has to be /script. < inserted on prev line. do not change it or bad things will happen.    
sb.Append("/script>"); 
//add script to page 
this.LiteralMBoxScript.Text = sb.ToString(); 
+1

Должен признаться, мне очень любопытно, что произойдет, если вы переместите '<' на следующую строку. – StriplingWarrior

+0

его страница продукта для электронной коммерции. оставляя <приведет к тому, что части страницы будут перегруппированы и испорчены. – tking

+0

@StriplingWarrior ~ '' обычно измельчается на странице. Раньше я сталкивался с этим, но я забыл, когда и почему сейчас. – jcolebrand

ответ

0

Что вы хотите сделать что-то вроде этого: (это не фактический рабочий код)

StringBuilder sb = new StringBuilder(""); 
foreach(item in collection) 
{ 
    sb.Append("<script type=\"text/javascript\">"); 
    //do your javascript stuff here 
    sb.Append("</script>"); 
} 

literal.Text = sb.ToString(); 
+0

Я пробовал этот метод, но он не работает, как мне это нужно. Мне нужно создать отдельный блок javascript для каждого элемента. Это ставит их всех в одно. – tking

+0

нет, если вы добавляете тег скрипта в каждую итерацию !! Изменили код для демонстрации – jimplode

+0

Хорошо, я понимаю, что вы говорите. Сожалею. Я попробую. – tking

0

Вы должны сериализации коллекцию JSON с использованием JavaScriptSerializer. Использование LiteralControl и StringBuilder для создания Javascript пахнет ...

+0

как здесь создается помощь json? – jimplode

+0

@jimplode - вам не нужно генерировать js с * каждым * запросом. Просто напишите функцию, которая примет ваш объект JSON в .js-файле, который может быть кэширован браузером и передать ему сериализованную коллекцию. –

+0

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

0

Я понимаю, что @jimplode предложил оборачивать вокруг с foreach, и это хорошее предложение. Я собираюсь решить другую часть проблемы.

Injecting Client-Side Script from an ASP.NET Server Control

и попробовать этот блок на для читаемости: (обратите внимание, что нет Добавление данных, потому что это не создает строку и последовательно добавляя к нему так, что мое понимание того, что это работает, а также StringBuilder.Append()

.
string myScript = @" 
<script type='text/javascript'> 
    mboxCreate(
     'product_productpage_rec', 
     'entity.id=" + _prodID + @"', 
     'entity.categoryId=" + _categoryID + @"', 
     'entity.name=" + _prod.Title + @"', 
     'entity.pageURL=" + Request.Url.ToString() + @"', 
     'entity.thumbnailURL=" + filename + @"', 
     'entity.inventory=" + _prod.ActiveProductItemCollection.Count + @"', 
     'entity.value=" + _prod.ActiveProductItemCollection[0].ActualPrice + @"', 
     'entity.ProductItemID=" + prodItem.Id + @"', 
     'entity.addToCartImg=~/Images/Buttons/btn_AddToCartFlat.gif' 
    ); 
</script>" 
+0

Итак, вы говорите, объявляете строку, как показано выше, а затем делаете foreach Console.Writeline (myscript); ? – tking

+0

что-то вроде этого ... да. Вы понимаете, что делает этот код? '@' В частности – jcolebrand

+0

нет, а не @. извините, я новичок в разработке .NET. – tking

2

Я думаю, что вы не должны делать это в коде позади, так как это чисто клиентский код на стороне, вы должны сделать это на странице ASPX с помощью тегов сервера

Я symplifying вашего примера но идея есть:

Предполагая, что вы объявили сбор в вашем коде позади:

protected List<Person> persons = new List<Person>(); 

protected void Page_Load(object sender, EventArgs e) 
     { 
      persons.Add(new Person() { Name = "Toto", Firstname="Bobo" }); 
      persons.Add(new Person() { Name = "Titi", Firstname = "Bibi" }); 
     } 

Вы положили, что в вашем ASPX

<% foreach (var person in persons) 
    { %> 
<script type="text/javascript"> 
    mboxCreate("person.name=" + "<%=person.Name%>", "person.firstname=" + "<%=person.Firstname%>"); 
</script> 
<%} %> 

Это сгенерирует следующий HTML:

<script type="text/javascript"> 
mboxCreate("person.name=" + "Toto", "person.firstname=" + "Bobo"); 
</script> 

<script type="text/javascript"> 
mboxCreate("person.name=" + "Titi", "person.firstname=" + "Bibi"); 
</script> 

Огромное преимущество заключается в том, что вам больше не нужно делать эти уродливые строки, контактирующие в вашем коде. И это намного легче читать/поддерживать.

+0

Хороший звонок там @sigo. Кроме того, он может использовать элемент управления ASP: REPEATER и делать что-то подобное. Затем он мог получить все преимущества привязки данных (в данном случае не так много, но именно поэтому я предлагаю ретранслятор, самый легкий из группы) – jcolebrand

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