在标记中将复杂对象分配给用户控件

时间:2013-03-15 22:14:56

标签: asp.net user-controls webforms

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

假设我有一个具有复杂属性的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() %>" />

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

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

2 个答案:

答案 0 :(得分: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 %>" />

答案 1 :(得分: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);