我可以在代码隐藏中执行此操作,但我在标记本身中寻找一种懒惰的方法:
假设我有一个具有复杂属性的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() %>" />
但这无效。有关如何做到这一点的任何建议?我想我一次可以做一个属性,但我正在寻找一种更通用的方法 - 我传入的复杂对象比这个例子(数十个属性)要大得多,所以我不想即使我可以在标记中单独定义它们。
我想知道是否有某种神奇的<%$ %>
功能可以做到这一点。
答案 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);