C# 为项集合中的每个项生成文本

C# 为项集合中的每个项生成文本,c#,.net,asp.net,.net-4.0,C#,.net,Asp.net,.net 4.0,现在,我的页面上有一个文本控件。在我的代码隐藏中,我使用StringBuilder生成一些JavaScript。在那一页上,我还有一个项目集合。我要做的是为我的项目集合中的每个项目生成我的文字,这将在本质上生成我的JavaScript。下面是我现在的代码背后的一个例子。我可以做一些不同的事情,但我只需要为集合中的每个项目生成所述JavaScript,我不知道如何做 System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb

现在,我的页面上有一个文本控件。在我的代码隐藏中,我使用
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();
System.Text.StringBuilder sb=new System.Text.StringBuilder();
某人加上(“”);
sb.追加(“mboxCreate(\“product\u productpage\u rec\”,);
sb.追加(“\”entity.id=“+\u prodID+“\”,”);
sb.追加(“\”实体.categoryId=“+\u categoryId+“\”,”);
sb.追加(“\”entity.name=“+\u prod.Title+“\”,”);
sb.Append(“\”entity.pageURL=“+Request.Url.ToString()+“\”,”);
//以下值取自productImageControl代码。
//将来可能不得不作为图像控件的属性进行重构。
字符串文件名=AppSettingsManager.Current.ProductImagePathLarge+\u prod.ActiveProductItemCollection[0]。Sku+AppSettingsManager.Current.ProductImageExtension;
sb.追加(“\”实体.thumbnailURL=“+filename+“\”,”);
sb.追加(“\”实体.inventory=“+\u prod.ActiveProductItemCollection.Count+“\”,”);
sb.Append(“\”entity.value=“+\u prod.ActiveProductItemCollection[0]。实际价格+“\”,”;
sb.追加(“\”实体.ProductItemID=“+prodItem.Id+“\”,”);
sb.Append(“\”entity.addToCartImg=~/Images/Buttons/btn\u AddToCartFlat.gif\”);
//将脚本添加到页面
this.LiteralMBoxScript.Text=sb.ToString();

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

您想要做的事情如下:(这不是实际的工作代码)

StringBuilder sb=新的StringBuilder(“”);
foreach(集合中的项目)
{
某人加上(“”);
//在这里执行javascript操作
某人加上(“”);
}
literal.Text=sb.ToString();

我意识到@jimplode建议使用foreach进行包装,这是一个很好的建议。我将处理问题的另一部分

为了可读性,请尝试使用此块:(注意,没有追加,因为它不会创建字符串并重复添加到其中。因此,据我所知,这与
StringBuilder.Append()一样有效。

string myScript=@”
mboxCreate(
“产品页面记录”,
'entity.id=“+\u prodID++”,
'entity.categoryId=“+_categoryId++”,
'entity.name=“+\u prod.Title++”,
'entity.pageURL=“+Request.Url.ToString()+@]”,
'entity.thumbnailURL=“+filename+@]”,
'entity.inventory=“+\u prod.ActiveProductItemCollection.Count+@”,
'entity.value=“+\u prod.ActiveProductItemCollection[0].ActualPrice++”,
'entity.ProductItemID=“+prodItem.Id+@',
'entity.addToCartImg=~/Images/Buttons/btn\u AddToCartFlat.gif'
);
"  

我认为您不应该在代码隐藏中这样做,因为它纯粹是客户端代码,您应该在您的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" });
        }
protectedlist persons=new List();
受保护的无效页面加载(对象发送方、事件参数e)
{
添加(newperson(){Name=“Toto”,Firstname=“Bobo”});
添加(newperson(){Name=“Titi”,Firstname=“Bibi”});
}
你把它放进你的aspx里

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

mboxCreate(“person.name=“+”,“person.firstname=“+”);
这将生成以下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> 

mboxCreate(“person.name=“+”Toto”,“person.firstname=“+”Bobo”);
mboxCreate(“person.name=“+”Titi”,“person.firstname=“+”Bibi”);

最大的优点是,您不必再在代码背后进行那些难看的字符串连接。而且它更易于阅读/维护。

在这里创建json有什么帮助???@jimplode-您不必为每个请求生成js。只需编写一个函数,在.js文件中接受您的json对象,该文件可以被浏览器缓存ser,并将序列化的集合传递给它。我喜欢传递JSON数组的想法,但实际上他就是这么做的。你只是建议他序列化数据对象并将其作为字符串插入,但他在这里手工编写的方式,虽然没有JSON那么可移植,但已经足够了。我不会强迫重写它以使用JSON。@Jakub:Iagree JSON对象是轻量级的、很好的,但这不是问题中所问的。所以这里的问题不是如何使用JSON,而是如何向页面添加单独的javascript块。不过,我确实喜欢JSON。@Drachenster-我只是序列化数据-逻辑可以很好地写入正确的js文件,可以重用,不需要重新生成它还可以帮助维护并允许使用AJAX获取数据。我已经尝试过这种方法,但它无法满足我的需要。我需要为每个项目生成一个单独的javascript块。这会将它们全部放在一个块中。如果你在每个itteration中添加脚本标记,则不会!!修改代码以演示OK,我明白你的意思了你在说。对不起。我会试试。我必须承认,我真的很好奇,如果你移动
这是一个电子商务产品页面,会发生什么不好的事情。离开
会导致页面的某些部分被重新排列并破坏布局。@StriplingWarrior~通常
会从页面中被切碎。我以前遇到过,b但是我现在忘记了什么时候和为什么了。我发现这真的很难相信。一旦你调用ToString,它将是相同的字符串,一个字节一个字节。好的,你是说像上面那样声明字符串,然后执行foreach控制台。Writeline(myscri
<% foreach (var person in persons)
   { %>
<script type="text/javascript">
    mboxCreate("person.name=" + "<%=person.Name%>", "person.firstname=" + "<%=person.Firstname%>");
</script>
<%} %>
 <script type="text/javascript">
 mboxCreate("person.name=" + "Toto", "person.firstname=" + "Bobo");
 </script>

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