有没有办法以声明方式将代码隐藏属性值传递给服务器控件?

And*_*age 9 asp.net servercontrols inline-code

任何人都可以解释为什么你不能在ASP.Net中的服务器控制声明中使用内联代码块?

以下是一个简单的例子......

....
<form id="form1" runat="server">
    <asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
</form>
....
Run Code Online (Sandbox Code Playgroud)

代码块按字面意思呈现给页面...

<span id="Label1"><%= SomeProperty %></span>
Run Code Online (Sandbox Code Playgroud)

我最初的想法是它与在页面生命周期中处理这些事物的顺序有关.据<%=...%>我所知,这些块相当于Response.Write(...)代码隐藏.并且由于服务器控件实际上没有像标记中声明的那样呈现,我想在进行渲染之前可能无法处理嵌入的代码块.

我会非常感激任何人都能解释得更好一点.

但是,数据绑定代码块的<%#...%>行为方式明显不同,但任何人都可以告诉我为什么可以将它们嵌入到服务器控件中...

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

这很好用.

drs*_*222 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>
Run Code Online (Sandbox Code Playgroud)

解析了这个并创建了以下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    ");
}
Run Code Online (Sandbox Code Playgroud)

下面是<%#...%>语法引擎的一个例子:

<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>
Run Code Online (Sandbox Code Playgroud)

生成此代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,<%=...%>语法可以在服务器控件的属性之外使用,以直接呈现返回的值.另一方面,<%#...%>语法为标签的DataBinding事件生成事件处理程序.此事件将标签属性的值设置为SomeProperty的值.每当调用DataBind方法时都会触发DataBinding事件,这就是我将该调用添加到Page_Load事件的原因.
希望这有助于您了解它们之间的区别.