使用C#动态地将ASP.NET代码写入.aspx文件

时间:2013-08-16 22:26:30

标签: c# html asp.net .net

是否有可能在aspx文件中调用返回带有ASP.NET代码的字符串的方法,并在重新加载页面之前运行该代码?

所以几乎有如下内容:

<asp:DataList //blahblah>
   <ItemTemplate>
      <%= GenerateTable() %>
   </ItemTemplate>
</asp:DataList>

GenerateTable()创建一个表,其中包含asp:Label对象,其值由asp:DataList的DataSource确定。

现在,我正确地生成了ASP.NET代码。问题是它在页面加载之前没有翻译成HTML,所以你看不到它。

更新 我想要一个单独的方法来生成ASP.NET代码的原因是因为我想使列显示可配置,因此网站并不总是显示相同的列。

解决方案尝试更新: 我尝试创建以下用户控件来插入我的ASP.NET代码,但它仍然遇到同样的问题。我做错了吗?

用户控制:

 <%@ Control Language="C#" CodeBehind="TableGenerator.ascx.cs"      Inherits="DagReport_WebRole.DynamicData.FieldTemplates.TableGenerator" %>

<div class="tableRow">
    <%= this.GetASPCode() %>
</div>

用户控制C#:     使用System.Web.UI;

namespace DagReport_WebRole.DynamicData.FieldTemplates
{
    public partial class TableGenerator : System.Web.DynamicData.FieldTemplateUserControl
    {
        public string Code { get; set; }

        public string GetASPCode()
        {
             return Code;
        }
    }   
}

在我的ASPX文件中:

            <ItemTemplate>
                <div class="dagRow"></div>
                <userControl:TableGenerator
                    Code="<%=GetRowASPCode()%>"></userControl:TableGenerator>
            </ItemTemplate>

3 个答案:

答案 0 :(得分:10)

您可以在ItemTemplate中添加用户控件并在用户控件中执行代码,而不是像现在一样尝试直接代码注入。代码将动态构建所需的ASP.NET控件,并将它们添加到用户控件的.Controls集合中。

通过这种方式,您将拥有两全其美的优势:动态代码执行和(因为用户控制参与页面生命周期)正确的HTML生成。

更新

这是一个基本的例子。假设您创建了用户控件“WebUserControl2.ascx”并将其添加到主页:

<%@ Register src="WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc1" %>

然后您可以将它添加到DataList ItemTemplate:

 <asp:DataList runat="server" ID="DataList1">
 <ItemTemplate>
     <uc1:WebUserControl2 ID="MyWebUserControl" runat="server" />                
  </ItemTemplate>
 </asp:DataList>

在您的Web用户控件代码WebUserControl2.ascx.cs中添加标签,文本框和按钮:

protected void Page_Load(object sender, EventArgs e)
{
    Label Label1 = new Label();

    Label1.ID="Label1";
    Label1.Text = "Please enter info: ";
    this.Controls.Add(Label1);

    TextBox Textbox1 = new TextBox();
    Textbox1.ID="Textbox1";
    this.Controls.Add(Textbox1);


    Button Button1 = new Button();
    Button1.ID = "Button1";
    Button1.Text = "Submit";
    this.Controls.Add(Button1);

}

当页面运行并绑定DataList时,您将得到类似的内容:

enter image description here

您可以向用户控件添加属性并从主页面分配它们的值,例如DataList ItemCreated事件,这样控件就会知道当前正在创建哪个项目并采取相应的行动。

答案 1 :(得分:3)

不,因为代码GenerateTable()将在DataList或更晚的Page_Load数据绑定发生之前运行,具体取决于您是否有事件处理程序执行数据绑定而不是内置页面事件。

更新:

要在页面生命周期之外加载数据,您需要在页面生命周期之外执行此操作。

要在页面更新之间将HTML注入页面,那么您需要在客户端调用AJAX调用,如下所示:

这里我们有一个点击处理程序,它从服务器加载HTML片段,但它可以很容易地适应通过服务器端逻辑或模板返回动态HTML。

<script type="text/javascript">
    $(document).ready(function () {
        $("#myButton").click(function() {
            $.get("YourFile.html", function(data) {
                $("#YourDIV").append(data);
            });
        });
    });
</script>

注意:请注意,页面加载会擦除此动态加载的数据。

答案 2 :(得分:0)

不确定您要完成的是什么,但嵌套转发器如何:

<asp:Repeater ID="repeaterConversation" runat="server">
    <ItemTemplate>
        <asp:Repeater ID="rptPosts" runat="server">
            <ItemTemplate>
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>

然后在您的代码隐藏中:

Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    repeaterConversation.DataSource = source
    repeaterConversation.DataBind()
End Sub

Protected Sub repeaterConversation_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles repeaterConversation.ItemDataBound
    If (item.ItemType = ListItemType.Item Or item.ItemType = ListItemType.AlternatingItem) Then
        //here you can do calulations based on the data bound in the parent repeater
        //and also bind to controls and child repeaters
        Repeater_Posts = item.FindControl("rptPosts")
        Repeater_NewPostBtn = item.FindControl("btnNewPost")
        Repeater_Posts.DataSource = source
        Repeater_Posts.DataBind()
    End If
End Sub