2013-08-08 2 views
3

Этот код:Переменные внутри свойства управления

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

Выдает ошибку синтаксического анализатора.

Возможно ли установить свойства любым способом, аналогичным этому, без использования кода позади?

+0

Попробуйте использовать одиночные кавычки 'MaxLength = '<% = Настройки .UsernameMaxLength%> '' –

+0

Я полагаю, вы можете сделать то же самое, используя код в событии' page_init'. – shahkalpesh

ответ

2

Нет, это невозможно. Синтаксис <%= some code here %> не может использоваться с серверными элементами управления. Вы можете пойти с <%# some code here %>, но только в случае привязки данных, или просто установить это свойство в коде позади, скажем, на Page_Load:

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

Вы можете попробовать это, который должен установить значение MaxLength при оказании :

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

я думаю (не пробовал), вы также можете написать:

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

Но вы бы тогда п eed до call Username.DataBind() где-то в кодебе.

+0

'TextBox' сам по себе не может быть привязан к данным. Второй вариант будет работать только тогда, когда 'Username' находится внутри некоторого элемента управления, который может быть привязан к данным, например' GridView'. – Andrei

+0

@ Andrei Я просто попробовал второй вариант и, похоже, работает без какого-либо другого управляемого контейнера. TextBox действительно имеет метод DataBind: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox.databind.aspx – jbl

+0

Да, это сюрприз. Никогда не знал, что TextBox теперь имеет метод DataBind (кажется, что это так с ASP.NET 3.5). Он также хорошо объясняет, почему второй вариант работает без обертывания контроля привязки данных. Спасибо за информацию! – Andrei

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> 

Это просто для того, чтобы показать вам, что это не сложно. Но, пожалуйста, просмотрите учебник, к которому я привязан, чтобы посмотреть пример того, как обращаться с ожидаемым типом возвращаемого значения из вашего метода в зависимости от назначаемого свойства и т. Д.

Смежные вопросы