2012-04-25 67 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屬性,所以不會發生額外的編譯。