这段代码:
<asp:TextBox runat="server" MaxLength="<%=Settings.UsernameMaxLength %>" ID="Username"/>
引发解析器错误。
是否可以在不使用后面的代码的情况下以任何类似的方式设置属性?
不,这是不可能的。语法<%= some code here %>
不能与服务器端控件一起使用。您可以使用<%# some code here %>
,但仅在数据绑定的情况下,或者只是在代码中设置此属性,例如 on Page_Load
:
protected void Page_Load(object source, EventArgs e)
{
Username.MaxLength = Settings.UsernameMaxLength;
}
你可以试试这个,它应该在渲染时设置MaxLength值:
<%
Username.MaxLength = Settings.UsernameMaxLength;
%>
<asp:TextBox runat="server" ID="Username"/>
我认为(未尝试)你也可以写:
<asp:TextBox runat="server" MaxLength="<%#Settings.UsernameMaxLength %>" ID="Username"/>
但是你需要call Username.DataBind()
在代码隐藏的某个地方。
我在这里的聚会迟到了,但不管怎样……
你可以建立自己的Expression Builder
来处理这种情况。这将允许您使用如下语法:
<asp:TextBox
runat="server"
MaxLength="<%$ MySettings: UsernameMaxLength %>"
ID="Username"/>
注意$
标志。
要了解如何让自己拥有Expression Builder
,请阅读这个古老但仍然相关的教程。不要让文字墙吓跑你,因为最后,制作表达式构建器很容易。它基本上包括从方法派生一个类System.Web.Compilation.ExpressionBuilder
并覆盖该GetCodeExpression
方法。这是一个非常简单的示例(此代码的某些部分是从链接的教程中借用的):
public class SettingsExpressionBuilder : System.Web.Compilation.ExpressionBuilder
{
public override System.CodeDom.CodeExpression GetCodeExpression(System.Web.UI.BoundPropertyEntry entry, object parsedData, System.Web.Compilation.ExpressionBuilderContext context)
{
// here is where the magic happens that tells the compiler
// what to do with the expression it found.
// in this case we return a CodeMethodInvokeExpression that
// makes the compiler insert a call to our custom method
// 'GetValueFromKey'
CodeExpression[] inputParams = new CodeExpression[] {
new CodePrimitiveExpression(entry.Expression.Trim()),
new CodeTypeOfExpression(entry.DeclaringType),
new CodePrimitiveExpression(entry.PropertyInfo.Name)
};
return new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(
this.GetType()
),
"GetValueFromKey",
inputParams
);
}
public static object GetValueFromKey(string key, Type targetType, string propertyName)
{
// here is where you take the provided key and find the corresponding value to return.
// in this trivial sample, the key itself is returned.
return key;
}
}
为了在您的 aspx 页面中使用它,您还必须在以下位置注册它web.config
:
<configuration>
<system.web>
<compilation ...>
<expressionBuilders>
<add expressionPrefix="MySettings" type="SettingsExpressionBuilder"/>
</expressionBuilders>
</compilation>
</system.web>
</configuration>
这只是为了告诉你这并不难。但是请查看我链接到的教程,以查看如何根据分配的属性等处理方法的预期返回类型的示例。