【问题标题】:Force a control to DataBind from callback function executed in modal从模态中执行的回调函数强制控件到 DataBind
【发布时间】:2015-06-16 12:08:17
【问题描述】:

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

有什么想法吗??

【问题讨论】:

  • 请同时提供 aspx 标记。

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


【解决方案1】:

如果我正确理解了您的代码,则回调似乎在调用之前的请求时关闭了控件实例。

userGrid_OnAction 在页面生命周期的 post actions 阶段被调用,该阶段就在 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;
       }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多