3

我可以在代码隐藏中执行此操作,但我正在寻找一种在标记本身中执行此操作的懒惰方式:

假设我有一个具有复杂属性的 UserControl:

public class MyControl : UserControl {
    public Person Someone { get; set; }
}

我有一个带有此控件的页面:

<uc1:MyControl id="my1" runat="server" />

我想从页面标记中将一个人放入此控件,而不是代码隐藏。在代码隐藏中,它看起来像:

my1.Someone = GetSomePerson();

我想做:

<uc1:MyControl id="my1" runat="server" Someone="<%= GetSomePerson() %>" />

但这无效。关于如何做到这一点的任何建议?我想我可以一次做一个属性,但我正在寻找一种更通用的方法——我传入的复杂对象比这个例子大得多(几十个属性),所以我不想即使可以,也可以在标记中单独定义它们。

我想知道是否有某种神奇的<%$ %>功能可以做到这一点。

4

2 回答 2

2

我找到了一个实现了我正在寻找的东西的人:

http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

在 web.config 中包含一些代码和新的表达式生成器后,您可以使用 ASP.NET 表达式来执行此操作:

<uc1:MyControl runat="server" Someone="<%$ Code:GetSomePerson() %>" />

我不认为我会在我目前的项目中这样做,因为它不是一个真正的标准。我敢肯定,当人们在查看代码并试图弄清楚我做了什么时,他们会在路上完全说我的坏话——但知道未来绝对是件好事。

编辑

对于后代,以防万一此链接无法永久使用,以下是相关代码:

// C#:
[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder {
    public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, 
       object parsedData, ExpressionBuilderContext context) {
        return new CodeSnippetExpression(entry.Expression);
    }
}

// Web.config:
<compilation debug="true">
  <expressionBuilders>
    <add expressionPrefix="Code" type="Infinity.Web.Compilation.CodeExpressionBuilder"/>
  </expressionBuilders>
</compilation>

// ASP.NET .aspx:
<asp:CheckBox id="chk1" runat="server" Text="<%$ Code: DateTime.Now %>" />
于 2013-03-15T22:51:54.710 回答
1
<uc1:MyControl id="my1" runat="server" />
<% my1.Someone = GetSomePerson(); %>

或者因为这显然不是您要寻找的答案...

<uc1:MyControl id="my1" runat="server" someParameter="uniqueId" />

然后在uc1控件里面

public string someParameter;
Someone = GetSomePerson(someParameter);
于 2013-03-15T22:18:29.790 回答