2010-07-08 3 views
2

Работа над проектом ASP.NET 4.0, который использует пользовательские элементы управления для динамического создания формы на основе определений, хранящихся в базе данных. Одно поле формы будет выглядеть следующим образом:Связывание данных ASP.NET при обратной передаче

<usc:RefControl ID="ctrlUser1" 
    ReferenceFieldId='product.user1' 
    ValidationFormat="^\d+\.?\d{0,2}$" 
    runat="server"/> 

За кулисами управления излучает RegularExpressionValidator на основе свойства RefControl.ValidationFormat.

Это прекрасно работает, однако проблема в том, что эта архитектура позволяет нам проверять только регулярные выражения. Теперь мне нужно добавить проверку формата даты, основываясь на предпочтениях пользователя (которые не зависят от их UICulture).

Не желая реорганизовывать всю настройку пользовательского контроля, мне нужно иметь возможность передать шаблон регулярного выражения «на лету» в свойство ValidationFormat. В настоящее время я использую данные выражения привязки, чтобы связать свойство метода экземпляра страницы:

<usc:RefControl ID="ctrlUser2" 
    ReferenceFieldId='product.user2' 
    ValidationFormat="<%# GetUserDateValidationFormat()%>" 
    runat="server"/> 

код позади:

/// <summary> 
/// Returns a regular expression that validates the current user's date format 
/// </summary> 
public string GetUserDateValidationFormat() 
{ 
    //... 
} 

работает нормально на первой загрузке страницы, а на последующих постбэков проверка Безразлично Не работай. I думаю проблема в том, что выражение привязки данных вообще не оценивается, но я не уверен, что понимаю почему. Я вызываю Page.DataBind() в Page_Init, является ли Page.IsPostBack или нет, так не должно ли это работать?

Если вы видите, что я лаю по неправильному дереву, любые альтернативные решения одной и той же проблемы также приветствуются.

EDIT

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

Поскольку мне еще нужно выполнить инициализацию элемента управления перед Page_Load, чтобы подписаться на элементы управления для viewstate, я просто переместил логику инициализации в событие Page.InitComplete, чтобы вызов сначала вызывался на страницу.DataBind().

protected void Page_Init(object sender, EventArgs e) 
    { 
     Page.InitComplete += new EventHandler(Page_InitComplete); 
    } 

Так дерево событие становится

  1. пользовательский элемент управления Page_Init => Крюк Initcomplete обработчик
  2. Page (ASPX) Page_Init => Bind данных
  3. управления пользователя Page_InitComplete => Инициализировать управление

ответ

3

Не можете ли вы просто установить свойство в Page_Load()?

public void Page_Load(...) 
{ 
    ctrlUser1.ValidationFormat = GetUserDateValidationFormat(); 
    // do whatever stuff you do 
} 
+0

Это не сработало для меня, но совет был прав. Я просто не предоставил достаточно информации о проблеме, чтобы вы знали это :) Принято. – jevakallio

+0

ahh ... простота – andy

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