我正在开发一个Kentico Webforms项目,我的要求是提供一个模态窗口,允许我们更新父控件中的值。
父控件设置一个静态回调函数,该函数在进行选择时从模态执行。回调在传回的模态形式内执行并设置正确的值。我在更新的控件上调用DataBind()但是值没有更新,如果我设置了DataBinding回调,则不执行它
//Static container for call back reference
public static class CallbackContainer
{
public static Action<string> Callback { get; set; }
}
家长控制
protected override void OnPreRender(EventArgs e)
{
//Set callback
CallbackContainer.Callback = id => Value = id;
txtOrgName.DataBinding += (sender, args) =>
{
//Never executes
Debugger.Break();
};
}
public override object Value
{
get
{
return txtOrgName.Text;
}
set
{
txtOrgName.Text = value.ToString();
txtOrgName.DataBind();
Page.DataBind();
DataBind();
}
}
模态表格
//Executed on selection
protected void userGrid_OnAction(string actionName, object actionArgument)
{
//Callback passing selected value
CallbackContainer.Callback(actionArgument.ToString());
}
任何想法??
答案 0 :(得分:0)
如果我正确地理解了你的代码,那么回调似乎在调用它时调用实例上的前一个请求。
userGrid_OnAction在页面生命周期的后期操作阶段中调用,该阶段就在Load之后和PreRender之前,因此按此顺序执行:
Parent1.Load
Child1.Load
Parent1.PreRender
- CallbackContainer.Callback = set Parent1.Value
Child1.PreRender
Parent2.Load
Child2.Load
Child2.userGrid_OnAction
- set Parent1.Value
Parent2.PreRender
- CallbackContainer.Callback = set Parent2.Value
Child2.PreRender
虽然Parent1和Parent2是来自不同请求的对象
您可以从将回调分配从PreRender移动到OnLoad开始,但代码仍然不是线程安全的,因为您将为同一页面的所有请求共享一个静态,并且它们可能会发生冲突。
这就是改变后生命周期的样子:
Parent2.Load
- CallbackContainer.Callback = set Parent2.Value
Child2.Load
Child2.userGrid_OnAction
- set Parent2.Value
Parent2.PreRender
Child2.PreRender
但请求也可能以这种方式发生:
Parent2.Load
- CallbackContainer.Callback = set Parent2.Value
Parent1.Load
- CallbackContainer.Callback = set Parent1.Value
Child1.Load
Child2.Load
Child2.userGrid_OnAction
- set Parent1.Value
Parent2.PreRender
Child2.PreRender
Parent1.PreRender
Child1.PreRender
要使该属性特定于请求,以便各个请求不会发生冲突,您可以使用与此类似的代码:
public static class CallbackContainer
{
public static Action<string> Callback
{
get
{
return (Action<string>)HttpContext.Current.Items["CallbackContainer.Callback"];
}
set
{
HttpContext.Current.Items["CallbackContainer.Callback"] = value;
}
}
}