回发时的ASP.NET数据绑定

时间:2010-07-08 07:51:23

标签: asp.net data-binding postback

使用ASP.NET 4.0项目,该项目使用用户控件根据存储在数据库中的定义动态生成表单。一个表单字段如下所示:

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

在幕后,控件根据RefControl.ValidationFormat属性发出RegularExpressionValidator。

这很好用,但问题是这个架构只允许我们用正则表达式进行验证。现在我需要根据用户的偏好(不依赖于他们的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_Init中调用Page.DataBind()是否Page.IsPostBack,所以不应该这样做吗?

如果你看到我正在咆哮错误的树,那么同样问题的任何替代解决方案也是受欢迎的。

修改

管理来解决这个问题。问题在于ASP.NET页面生命周期在页面自己的事件之前调用用户控件的事件的方式。在页面上的数据绑定可能发生之前,正在初始化控件值。

因为我仍然需要在Page_Load之前进行控件初始化以将控件订阅到viewstate,所以我只是将初始化逻辑移动到Page.InitComplete事件,因此可以首先调用对Page.DataBind()的调用。

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

因此事件树变为

  1. 用户控制Page_Init =&gt; Hook InitComplete处理程序
  2. Page(aspx)Page_Init =&gt;绑定数据
  3. 用户控制Page_InitComplete =&gt;初始化控件

1 个答案:

答案 0 :(得分:3)

你难道不能在Page_Load()中设置属性吗?

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