控件属性中的变量

时间:2013-08-08 12:43:26

标签: c# asp.net controls

此代码:

<asp:TextBox runat="server" MaxLength="<%=Settings.UsernameMaxLength %>" ID="Username"/>

引发解析器错误。

是否可以在不使用后面的代码的情况下以任何类似的方式设置属性?

3 个答案:

答案 0 :(得分:2)

不,这是不可能的。语法<%= some code here %>不能与服务器端控件一起使用。您可以使用<%# some code here %>,但仅限于数据绑定,或者仅在代码中设置此属性,例如Page_Load

protected void Page_Load(object source, EventArgs e)
{
    Username.MaxLength = Settings.UsernameMaxLength;
}

答案 1 :(得分:1)

你可以尝试这个,它应该在渲染时设置 MaxLength 值:

<%
  Username.MaxLength = Settings.UsernameMaxLength;
%>
<asp:TextBox runat="server" ID="Username"/>

我认为(未尝试过)你也可以写:

<asp:TextBox runat="server" MaxLength="<%#Settings.UsernameMaxLength %>" ID="Username"/>

但是你需要在代码隐藏的某个地方call Username.DataBind()

答案 2 :(得分:0)

我来这里参加派对已经迟到了,但无论如何都要去...

您可以构建自己的Expression Builder来处理此案例。这将允许您使用这样的语法:

<asp:TextBox 
    runat="server" 
    MaxLength="<%$ MySettings: UsernameMaxLength %>"
    ID="Username"/>

请注意$符号。

要了解如何让自己拥有Expression Builder,请仔细检查这个陈旧但仍然相关的tutorial。不要让文本墙吓跑你,因为最终,制作表达式构建器很容易。它基本上包括从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>

这只是为了向您展示这并不困难。但请查看我链接的教程,以便查看如何根据所分配的属性等处理方法中的预期返回类型的示例。