2012-04-25 86 views
0

这里是一块我的代码,通过该我正在呈现HTML控制与RUNAT =“服务器”无法渲染RUNAT =“服务器”的HTML控制动态

var sb= new StringBuilder(); 
sb.AppendLine(" <div class='ItemDiv'>"); 
sb.AppendLine(" <h2>More Products </h2>"); 
sb.AppendLine(" <span class='separator'></span> <ul class='ulProducts'>"); 
foreach (var lead in list) 
{ 
    var name = lead.ProductName; 
    if (name.Length > 17) 
    { 
     name = string.Format("{0}...", name.Substring(0, 17)); 
    } 
    sb.AppendLine(string.Format("<li><img src='{0}' align='absmiddle' alt='{1}'/> 
            <span class='separator'> </span> 
            <a href='~/Item/{2}/{1}.aspx' runat='server' // issue is with runat='server' 
             style='font-size:8pt; text-transform:      
             capitalize;'>{1}</a></li>", 
           lead.ProductImagePath, name,lead.Id)); 
} 
sb.AppendLine("</ul> </div>"); 
ProductsBySame1.GetHtml = sb.ToString(); // ProductsbySame is usercontrol and GetHtml is property of innerHtml of div placed in the usercontrol. That is dynamically populated. 

我的输出:

<div id="ctl00_cphMain_ProductsBySame1_ltlProducts"> <div class='ItemDiv'> 

<h2>More Products </h2> 

<span class='separator'></span> <ul class='ulProducts'> 

<li><img src='Uploads/Images/8e4c426aa1464af0b45f43c8c773e8ae.jpg' align='absmiddle' alt='Ceftriaxone Injec...'/> <span class='separator'> </span><a href='~/Item/659/Ceftriaxone Injec....aspx' **runat='server'** style='font-size:8pt; text-transform: capitalize;'>Ceftriaxone Injec...</a> </li> 

<li><img src='Uploads/Images/9efa7b61cf9f467393089ca111fc5f51.jpg' align='absmiddle' alt='Clavulanate Potas...'/> <span class='separator'> </span><a href='~/Item/660/Clavulanate Potas....aspx' **runat='server'** style='font-size:8pt; text-transform: capitalize;'>Clavulanate Potas...</a> </li> 

</ul> </div> 

</div> 

请参阅上面的**。其实我使用UrlRewriting.Net模块来重写网址。根据他们的文档,以〜/开头的链接将只起作用。所以我ambuilding我的网址,因为〜/只适用于runat ='服务器'。

所以最后我的问题是,我的上面的href不工作,因为runat ='服务器'在渲染时没有解析。根据我的使用场景,请在呈现html时帮助我。

在此先感谢。

+0

究竟为什么你不只是使用像一个'Repeater'控制建立你的列表 - 你可以在其ItemTemplate中使用任何服务器端控件。 – Filburt 2012-04-25 21:19:31

+0

这是一个jQuery的滑块,我从代码动态创建,我试过了,我无法构建带有中继器的jQuery滑块 – 2012-04-25 21:35:07

+0

使用我的答案中的示例将为您提供完全相同的呈现的html和所需的url方案。 – Filburt 2012-04-25 21:51:13

回答

3

只需使用一个Repeater控制,而不是构建HTML从头开始:

<asp:Repeater ID="MyRepeater" runat="server"> 
    <HeaderTemplate> 
     <div class="ItemDiv"> 
      <h2>More Products </h2> 
      <span class='separator'></span> 
      <ul class='ulProducts'> 
    </HeaderTemplate> 

    <ItemTemplate> 
     <li> 
      <img src="<%...%>" align="absmiddle" alt="<%...%>" /> 
      <span class='separator'> </span> 
      <a href="<%...%>" runat="server" style="font-size:8pt; text-transform:capitalize;"><%...%></a> 
     </li> 
    </ItemTemplate> 

    <FooterTemplate> 
      </ul> 
     </div> 
    </FooterTemplate> 
</asp:Repeater> 

(添加绑定虚拟占位符)

3

当您使用设计器添加控件runat="server"时,Visual Studio会在.designer.cs文件中为它创建对象。所以你的控件是在标记和代码隐藏中定义的。如果您要动态构建网站,则Page元素上没有对象。

我建议你在CreateChildControls方法中增加控制到Page。事情是这样的:

Page.Controls.Add(new Hyperlink() { Url="http://www.example.com" }); 
1

RUNAT =“服务器”是唯一没有告诉编译器创造什么样的对象时,它编译ASPX标记为一类。你正在做的是设置一个已经编译好的控件的text属性,所以不会发生额外的编译。