2010-07-08 61 views
2

使用ASP.NET 4.0项目,该项目使用用户控件根据存储在数据库中的定义动态生成表单。一个表单字段应该是这样的:ASP.NET数据绑定回发

<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 =>钩InitComplete处理机
  2. 页(CSS)Page_Init =>绑定数据
  3. 用户控制Page_InitComplete =>初始化控制

回答

3

难道你只是在Page_Load()中设置属性?

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

这不适合我,但建议是健全的。我只是没有提供足够的关于这个问题的信息,以便你知道这个:) Accepted。 – jevakallio 2010-07-12 08:08:37

+0

啊......简单 – andy 2010-07-12 08:08:50