如何动态生成服务器端标记

时间:2010-04-19 08:24:24

标签: c# asp.net html code-generation

我有一个ASP.net页面,其中包含一些控件。

我通过代码生成此控件,[实际上我有一个方法,它使用stringBuilder并将Serverside标记添加为平面字符串]

我的页面正确显示内容但不幸的是我的控件变得像客户端控件

例如,我在生成的代码上有一个不能正常工作的LoginView,而且我还从LocalResources读取了一些不会出现在页面上的字符串

如何才能使我的生成方法正确

这是代码

protected string CreateSubSystem(string id, string roles, string AnonymousTemplateClass, string href, string rolesContentTemplateClass, string LoggedInTemplateClass)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("<div class=\"SubSystemIconPlacement\" id=\"");
    sb.Append(id);
    sb.Append("\"><asp:LoginView runat=\"server\" ID=\"");
    sb.Append(id);
    sb.Append("\"><AnonymousTemplate><div class=\"");
    sb.Append(AnonymousTemplateClass);
    sb.Append("\"></div><asp:Label ID=\"lblDisabled");
    sb.Append(id);
    sb.Append("\" runat=\"server\" SkinID=\"OneColLabel\" meta:resourcekey=\"lbl");
    sb.Append(id);
    sb.Append("\" /></AnonymousTemplate><RoleGroups><asp:RoleGroup Roles=\"");
    sb.Append(roles);
    sb.Append("\"><ContentTemplate><a class=\"ImageLink\" href=\"");
    sb.Append(href);
    sb.Append("\"><div class=\"");
    sb.Append(rolesContentTemplateClass);
    sb.Append("\"></div></a><asp:HyperLink runat=\"server\" CssClass=\"SubSystemText\" ID=\"lnk");
    sb.Append(id);
    sb.Append(" NavigateUrl=\"~/");
    sb.Append(href);
    sb.Append(" \" meta:resourcekey=\"lbl");
    sb.Append(id);
    sb.Append("\" /></ContentTemplate></asp:RoleGroup></RoleGroups><LoggedInTemplate><div class=\"");
    sb.Append(LoggedInTemplateClass);
    sb.Append("\"></div><asp:Label runat=\"server\" SkinID=\"OneColLabel\" ID=\"lblDisabledLoggedIn");
    sb.Append(id);
    sb.Append("\" meta:resourcekey=\"lbl");
    sb.Append(id);
    sb.Append("\" /></LoggedInTemplate></asp:LoginView>");
    sb.Append("</div>");
    return sb.ToString();
}

我也在page_PreRender事件

上使用此方法

1 个答案:

答案 0 :(得分:2)

您需要实例化服务器端控件,然后将它们附加到父节点。您无法在客户端上转储标记以获得服务器端控制。

由于asp.net引擎使用服务器控件,然后为您呈现正确的客户端标记。所以一旦在客户端端,并从服务器端释放

Dim t As TextBox
t = New TextBox
PlaceHolder1.Controls.Add(t)

试试这个This simple expample。希望有所帮助:)