无法使用 runat=“server” 动态呈现 html 控件
本文关键字:动态 控件 html server runat | 更新日期: 2023-09-27 18:32:11
这是我的一段代码,我通过它使用 runat="server" 渲染 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 模块来重写网址。根据他们的文档,以 ~/开头的链接将仅有效。所以我正在构建我的网址,因为~/仅适用于runat='server'。
所以最后我的问题是我的上述 href 不起作用,因为在渲染时没有解决 runat='server'。请根据我的使用场景在渲染 html 时帮助我。
提前谢谢。
当您使用设计器中的runat="server"
添加控件时,Visual Studio 会在.designer.cs
文件中为其创建对象。因此,控件在标记和代码隐藏中定义。如果您正在动态构建网站,则Page
元素上没有对象。
我建议您在CreateChildControls
方法中添加对Page
的控制。像这样:
Page.Controls.Add(new Hyperlink() { Url="http://www.example.com" });
只需使用 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>
(添加了用于绑定的虚拟占位符)
runat="server"只是告诉编译器在将 ASPX 标记编译为类时要创建的对象。 您正在做的是设置已编译控件的 text 属性,因此不会进行其他编译。