2013-08-16 259 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 
相關問題