为项集合中的每个项生成文字

时间:2010-10-21 20:16:11

标签: c# .net asp.net .net-4.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();

4 个答案:

答案 0 :(得分:2)

我认为您不应该在后面的代码中执行此操作,因为它纯粹是客户端代码,您应该使用服务器标记在您的aspx页面中执行此操作

我正在简化你的例子,但想法就在那里:

假设您已在代码中声明了集合:

 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> 

巨大的优势在于您不必再在代码中执行那些丑陋的字符串连接。而且阅读/维护起来要容易得多。

答案 1 :(得分:0)

您应该使用 JavaScriptSerializer 将集合序列化为 JSON 。 使用LiteralControl和StringBUilder生成javascript气味...

答案 2 :(得分: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();

答案 3 :(得分: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>"