【问题标题】:Dynamically write ASP.NET code to .aspx file using C#使用 C# 将 ASP.NET 代码动态写入 .aspx 文件
【发布时间】:2013-08-19 10:24:41
【问题描述】:

是否有可能在一个 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>

【问题讨论】:

  • 如何使用抽象类和装饰器(模式)动态注入不同的对象?例如,这可以使用依赖注入来完成。
  • @PmanAce 我不确定我是否理解。你能举个例子吗?

标签: c# html asp.net .net


【解决方案1】:

与您现在尝试的直接代码注入不同,您可以将用户控件添加到您的 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 时,你会得到类似的东西:

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

【讨论】:

  • 谢谢!我会调查这个!如果您有任何好的参考资料,请告诉我。 =]
  • 我想我仍然遇到了同样的问题,即生成了 ASP 代码但没有执行。我将在上面添加我的代码。
  • 您仍在使用&lt;%= %&gt;。别。在 Control 的 CS 代码中执行您需要的任何代码,例如在加载事件中。不要将该代码作为控制输出发送。在内部 CS 代码中生成您需要的任何控件,将它们添加到控件的集合中。
  • 如果我需要 HTML 代码来包围控件怎么办?它们都只是表格中的asp:Labels,所以周围有tds 和trs,它们也指定了列的宽度。
  • 您可以动态构建整个结构、表格、标签以及您需要的任何其他内容。您可以将 Table 添加到 usercontrol .Controls 集合中,并通过将行和单元格添加到 Table 来填充它。您也可以动态地将标签等添加到表格单元格中。
【解决方案2】:

不,因为代码 GenerateTable() 将不会运行,直到 DataList 的数据绑定发生,即在 Page_Load 期间或更晚,这取决于您是否有一个事件处理程序执行数据绑定而不是内置页面事件。

更新:

要在页面生命周期之外加载数据,则需要在页面生命周期之外进行。

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

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

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

注意:请注意,页面加载会清除这些动态加载的数据。

【讨论】:

  • 哇,伙计。谢谢!你知道有没有办法解决这个问题?
  • 有没有办法在数据绑定之前插入代码?我确实从事件处理程序中调用它。
  • 如果您真的想将 HTML 注入页面,那么最好的办法是通过客户端的 AJAX 调用来完成,请参阅答案中的更新。
【解决方案3】:

不确定您要完成什么,但嵌套中继器怎么样:

<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

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2014-06-29
    相关资源
    最近更新 更多