Привязка данных ASP.NET при обратной передаче - PullRequest
2 голосов
/ 08 июля 2010

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

<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() 
{
    //...
}

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

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

EDIT

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

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

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

Таким образом, дерево событий становится

  1. User Control Page_Init => Обработчик перехватчика InitComplete
  2. Page (aspx) Page_Init => Связать данные
  3. Пользовательский элемент управления Page_InitComplete => Инициализировать элемент управления

1 Ответ

3 голосов
/ 08 июля 2010

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

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