ASP.NET :Привязка максимальной длины текстового поля к константе класса в HTML

StackOverflow https://stackoverflow.com/questions/247369

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

Ta

Это было полезно?

Решение

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

<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.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top