2013-08-16 81 views
4

是否有可能使用ASP.NET代码返回字符串的方法在aspx文件中调用,并且在重新加载页面之前运行该代码?使用C#动态地将ASP.NET代码写入.aspx文件

所以非常有类似如下:

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

GenerateTable()创建与ASP的表:在他们的标签对象,它们的值由ASP的DataSource确定:DataList控件。

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

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

更新解决方案尝试: 我试图创建下面的用户控件插入我的ASP.NET代码,但它仍然运行到同样的问题。我做错了吗?使用的System.Web.UI ;:

用户控制:

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

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

用户控制C#

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> 
+0

如何使用抽象类和装饰(模式)动态注入不同的对象?这可以使用依赖注入来完成。 – PmanAce

+0

@PmanAce我不知道我明白。你能举一个例子吗? –

回答

10

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

这样您就可以获得两全其美的效果:您的动态代码执行和(因为用户控件参与页面生命周期)正确的HTML生成。

UPDATE

这里是一个基本的例子。比方说,你创建用户控制“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事件,这样的控制会意识到当前创建该项目,并采取相应的行动。

+0

谢谢!我会研究这个!如果您有任何好的参考资料,请告诉我。 =] –

+0

我想我仍然遇到ASP代码生成但未执行的相同问题。我将在上面添加我的代码。 –

+0

您仍在使用'<%= %>'。别。在Control的CS代码中执行你需要的任何代码,例如在Load事件中。不要将该代码作为控制输出发送。在内部的CS代码中生成你需要的任何控件,并将它们添加到控件的集合中。 –

3

没有,因为代码GenerateTable()不会运行,直到数据绑定的DataList的发生是在Page_Load或更高,这取决于如果你有一个在事件处理程序执行数据绑定而不是内置页面事件。

UPDATE:

要加载页面生命周期之外的数据,那么你需要做的是页面生命周期之外。

要注入HTML到页面更新的页面,那么你就需要调用客户端AJAX调用,就像这样:

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

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

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

+0

噢,伙计。谢谢!你知道是否有办法解决这个问题? –

+0

有没有办法在数据绑定之前插入代码?我确实从事件处理程序调用它。 –

+0

如果您确实想将HTML注入到页面中,那么最好的办法就是在客户端通过AJAX调用完成,请参阅UPDATE in answer。 –

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 
相关问题