9

ASP.Net のサーバー コントロール宣言内でインライン コード ブロックを使用できない理由を誰か説明できますか?

以下は簡単な例です...

....
<form id="form1" runat="server">
    <asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
</form>
....

コードブロックは文字通りページにレンダリングされます...

<span id="Label1"><%= SomeProperty %></span>

私の最初の考えでは、ページのライフサイクルでこれらが処理される順序に関係しているということです。ブロックは、私が理解しているように、分離コード<%=...%>に相当します。Response.Write(...)また、サーバー コントロールは実際にはマークアップで宣言されているとおりにはレンダリングされないため、このレンダリングが行われる前に埋め込みコード ブロックを処理できない可能性があると思います。

誰かがそれをもう少しうまく説明できることにとても感謝しています。

ただし、データ バインディング コード ブロックの<%#...%>動作は明らかに異なりますが、サーバー コントロール内にこれらを埋め込むことができる理由を誰か教えてください...

....
<asp:Repeater id=Repeater1 runat="server">
    ....
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Eval(“SomeProperty”) %>'></asp:Label>
    </ItemTemplate>
    ....
</asp:Repeater>
....

これはうまくいきます。

4

3 に答える 3

7

あなたは<%=...%>構文についてほとんど正しいです。これは、内部で何が起こるかの例です。

<script runat="server">
    public string SomeProperty { get { return "Hello World!"; } }
</script>

<form id="form1" runat="server">
    <%= SomeProperty %>
    <div>
        <asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
    </div>
</form>

これが解析され、次のC#コードが作成されます(少し簡略化しました)。

private Label @__BuildControlLabel1() 
{
    Label @__ctrl = new Label();
        
    this.Label1 = @__ctrl;
    @__ctrl.ApplyStyleSheetSkin(this);
    @__ctrl.ID = "Label1";
    @__ctrl.Text = "<%= SomeProperty %>";
    return @__ctrl;
}

private void @__Renderform1(HtmlTextWriter @__w, Control parameterContainer) 
{
    @__w.Write( SomeProperty );
    @__w.Write("\r\n    <div>\r\n        ");
    parameterContainer.Controls[0].RenderControl(@__w);
    @__w.Write("\r\n    </div>\r\n    ");
}

<%#...%>構文の内部で何が起こるかの例を次に示します。

<script runat="server">
    public string SomeProperty { get { return "Hello World!"; } }
    protected void Page_Load(object sender, EventArgs e) { Label1.DataBind(); }
</script>

<form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="<%# SomeProperty %>"></asp:Label>
    </div>
</form>

このコードを生成します:

private Label @__BuildControlLabel1() 
{
    Label @__ctrl = new Label();
    
    this.Label1 = @__ctrl;
    @__ctrl.ApplyStyleSheetSkin(this);
    @__ctrl.ID = "Label1";
    @__ctrl.DataBinding += new System.EventHandler(this.@__DataBindingLabel1);
    return @__ctrl;
}

public void @__DataBindingLabel1(object sender, EventArgs e) 
{
    Label dataBindingExpressionBuilderTarget = ((Label)(sender));
    Page Container = ((Page)(dataBindingExpressionBuilderTarget.BindingContainer));
        
    dataBindingExpressionBuilderTarget.Text = System.Convert.ToString( SomeProperty , System.Globalization.CultureInfo.CurrentCulture);
}

ご覧の<%=...%>とおり、サーバーコントロールのプロパティの外部で構文を使用して、戻り値を直接レンダリングできます。一方、<%#...%>構文は、ラベルのDataBindingイベントのイベントハンドラーを生成します。このイベントは、ラベルのプロパティの値をSomePropertyの値に設定します。DataBindingイベントは、DataBindメソッドが呼び出されるたびに発生します。そのため、その呼び出しをPage_Loadイベントに追加しました。
うまくいけば、これはあなたがそれらの違いを理解するのに役立つでしょう。

于 2009-08-14T22:13:54.637 に答える
3

カスタムExpressionBuilderを作成して、次のようなものを使用できます<%$ Code: SomeProperty %>

于 2009-08-13T10:38:15.513 に答える