回发时的 ASP.NET 数据绑定(bind)

标签 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 属性。目前,我正在使用数据绑定(bind)表达式将属性绑定(bind)到页面实例方法:

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

在首页加载时工作正常,但在后续回发时验证不起作用。我认为问题是数据绑定(bind)表达式根本不计算,但我不确定我是否理解原因。我在 Page_Init 中调用 Page.DataBind(),无论是否 Page.IsPostBack,所以这不应该起作用吗?

如果您发现我找错了对象,也欢迎针对同一问题的任何替代解决方案。

编辑

成功解决了这个问题。问题在于 ASP.NET 页面生命周期在页面自身的事件之前调用用户控件的事件的方式。在页面上的数据绑定(bind)发生之前,控件值已被初始化。

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

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

所以事件树变成了

  1. 用户控制 Page_Init => Hook InitComplete 处理程序
  2. 页面 (aspx) Page_Init => 绑定(bind)数据
  3. 用户控件 Page_InitComplete => 初始化控件

最佳答案

您不能直接在 Page_Load() 中设置该属性吗?

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

关于回发时的 ASP.NET 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3201600/

相关文章:

c# - 管理单个 key 的 ASP.NET session 超时

c# - 如何验证集合类型?

c# - 如何将索引号作为值输入到foreach中?

asp.net - 文本框值未清除

asp.net - 如何避免在回发时从 asp.net 重复输入?

c# - 在单个页面中处理来自动态创建的控件的多个 "chained"回发

c# - 打开 XML 表头同一页

c# - 失去焦点时 Datagridview 单元格丢失输入值

WPF依赖属性问题

json - 将 JSON 数据绑定(bind)到操作参数