代码之家  ›  专栏  ›  技术社区  ›  jevakallio

回发时的ASP.NET数据绑定

  •  2
  • jevakallio  · 技术社区  · 14 年前

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

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

    这很好,但是问题是这个架构只允许我们用regex进行验证。现在,我需要根据用户的首选项(不依赖于用户的UICulture)添加日期格式验证。

    <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.IsPostBack与否,我都在Page\u Init中调用Page.DataBind(),所以这不应该工作吗?

    如果你看到我找错人了,同样问题的任何替代解决方案也是受欢迎的。

    编辑

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

    因为我仍然需要在Page\加载之前进行控件初始化,以便将控件订阅到viewstate,所以我只需将初始化逻辑移到Page.InitComplete事件,这样就可以首先调用Page.DataBind()调用。

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

    所以事件树变成

    1. 页面(aspx)页面\u Init=>绑定数据
    2. 用户控件页\u InitComplete=>初始化控件
    1 回复  |  直到 14 年前
        1
  •  3
  •   Tomas Aschan    14 年前

    你就不能在页面加载()中设置属性吗?

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