从模态

时间:2015-06-16 12:08:17

标签: c# asp.net data-binding webforms kentico

我正在开发一个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());
}

任何想法??

1 个答案:

答案 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;
       }
    }
}