ASP.NET: привязка максимальной длины текстового поля к константе класса в HTML - PullRequest
2 голосов
/ 29 октября 2008

Я пытаюсь разрешить моим веб-дизайнерам использовать имеющиеся у нас метаданные о полях базы данных на создаваемых ими страницах asp.net. Наиболее очевидным является следующее:

<asp:TextBox runat="server" id="txTextBox" MaxLength="<Value From Metadata here>" ... />

Все необходимые метаданные хранятся в объектах нашего класса и доступны благодаря своей общедоступной статической природе.

Преимущество этого состоит в том, что они могут устанавливать значения, которые

a) может измениться без их ведома или заботы
b) улучшение пользовательского опыта с минимальными усилиями по кодированию

и все, не имея их, должны беспокоиться о том, что это за ценность или откуда она взялась. Это в первую очередь будет использоваться для автоматически связанных элементов управления, то есть тех, которые добавляются практически без взаимодействия с разработчиком.

Этот вопрос очень похож на Один из моих предыдущих вопросов , который теперь прекрасно работает (но это было в WPF / XAML).

Суть этого вопроса в том, что мне нужно как можно меньше требований разработчика - в идеале должен быть какой-то синтаксис типа <%# Constant.Value %>, который можно было бы использовать непосредственно в атрибуте Maxlength="" элемента управления asp: Textbox что никакой код не нужно добавлять на страницу / usercontrol вообще.

У меня такое ощущение, что это невозможно, но я бы хотел, чтобы кто-то доказал, что я не прав.

Та

Ответы [ 2 ]

1 голос
/ 29 октября 2008

Вы можете использовать выражение привязки данных:

<asp:TextBox MaxLength="<%# Constant.Value %>" />

но , что требует, чтобы он находился в элементе управления с привязкой к данным. Если это не повторитель или что-то подобное, вам нужно вызвать Container.DataBind () в какой-то момент жизненного цикла страницы.

В качестве альтернативы, вы можете создать ExpressionBuilder , который бы разрешал синтаксис, такой как:

<asp:TextBox MaxLength="<%$ Constants:Value %>" />

Вот пример, который будет извлечен из одного статического словаря:

using System;
using System.Web.UI;
using System.Web.Compilation;
using System.CodeDom;
using System.Collections.Generic;

class ConstantsExpressionBuilder : ExpressionBuilder {
   private static readonly Dictionary<string, object> Values = 
      new Dictionary<string, object>() {
         { "Value1", 12 },
         { "Value2", false },
         { "Value3", "this is a test" }
      };

   public override bool SupportsEvaluate { get { return true; } }

   public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) {
      string key = entry.Expression.Trim();
      return GetValue(key);
   }

   public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) {
      CodePrimitiveExpression keyExpression = new CodePrimitiveExpression(entry.Expression.Trim());
      return new CodeMethodInvokeExpression(this.GetType(), "GetValue", new CodeExpression[] { keyExpression });       
   }

   public static object GetValue(string key) {
      return Values[key];
   }
}

Вы бы зарегистрировали это в web.config:

<system.web>
   <compilation>
      <expressionBuilders>
    <add expressionPrefix="Constants" type="ConstantsExpressionBuilder" />
      </expressionBuilders>
   </compilation>
</system.web>

И позвоните на странице ASPX:

<asp:Textbox runat="server" MaxLength="<%$ Constants:Value1 %>" ReadOnly="<%$ Constants:Value2 %>" Text="<%$ Constants:Value3 %>" />

Который должен производить:

<input type="text" maxlength="12" readonly="false" value="this is a test" />

в выводе HTML.

0 голосов
/ 29 октября 2008

Я думаю, вы должны быть в состоянии сделать это с чем-то вроде

<asp:TextBox runat="server" id="txTextBox" MaxLength="<%=Constants.SomeValue%>" />

Но меня беспокоит только то, что это не имеет особого смысла. Если константа хранится в файле .cs для внесения изменения, которое приведет к отражению нового значения константы в пользовательском интерфейсе, вам придется перекомпилировать сайт. Я думаю, что может быть проще просто иметь жестко запрограммированное значение на странице .aspx, которое можно легко изменить без необходимости перекомпиляции всей кодовой базы. Может быть, я не понимаю проблемы, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...