Asp.net ScriptManager.RegisterExpandoatAttribute不是';不为ajax工作

Asp.net ScriptManager.RegisterExpandoatAttribute不是';不为ajax工作,asp.net,ajax,servercontrols,partial-postback,Asp.net,Ajax,Servercontrols,Partial Postback,我正在创建一个服务器控件,它有一个属性,我正在将其添加为expando属性。它在初始页面加载时工作,但在部分回发后,它停止工作。我的expando属性消失了 该类是从telerik RadButton派生的类 这就是我在重写的PreRender方法中所做的: Dim radContextMenu As RadContextMenu = Parent.FindControl(ContextMenuID) If radContextMenu IsNot Nothing Then 'registe

我正在创建一个服务器控件,它有一个属性,我正在将其添加为expando属性。它在初始页面加载时工作,但在部分回发后,它停止工作。我的expando属性消失了

该类是从telerik RadButton派生的类

这就是我在重写的PreRender方法中所做的:

Dim radContextMenu As RadContextMenu = Parent.FindControl(ContextMenuID)
If radContextMenu IsNot Nothing Then
  'register the name of our context menu so we can access it from javascript
  ScriptManager.RegisterExpandoAttribute(Me, Me.ClientID, "ContextMenuClientID", radContextMenu.ClientID, False)
End If
正如您所看到的,我使用的是ScriptManager,它应该在部分回发senarios中工作(我的其他项目也有),但RegisterExpandoAttribute在这里似乎不起作用。此外,我还仔细阅读了代码,确定FindControl确实找到了radContextMenu


任何关于我做错了什么的见解都将受到极大的赞赏。感谢您

通过添加对页面的
ScriptManager.IsInAsyncPostBack
属性的检查,解决了类似问题。当设置为
false
时,应使用
.Page.ClientScript.registereexpandoattribute
方法

我最终为
控件
提供了新的扩展方法,其中包含以下逻辑:

public static void RegisterExpandoAttribute(this Control control, HtmlTextWriter writer, string attributeName, string attributeValue, bool encode = false)
{
    var scriptManager = ScriptManager.GetCurrent(control.Page);
    if (scriptManager != null && scriptManager.IsInAsyncPostBack)
        ScriptManager.RegisterExpandoAttribute(control, control.ClientID, attributeName, attributeValue, encode);
    else
        control.Page.ClientScript.RegisterExpandoAttribute(control.ClientID, attributeName, attributeValue, encode);
}

通过为页面的
ScriptManager.IsInAsyncPostBack
属性添加检查,解决了类似问题。当设置为
false
时,应使用
.Page.ClientScript.registereexpandoattribute
方法

我最终为
控件
提供了新的扩展方法,其中包含以下逻辑:

public static void RegisterExpandoAttribute(this Control control, HtmlTextWriter writer, string attributeName, string attributeValue, bool encode = false)
{
    var scriptManager = ScriptManager.GetCurrent(control.Page);
    if (scriptManager != null && scriptManager.IsInAsyncPostBack)
        ScriptManager.RegisterExpandoAttribute(control, control.ClientID, attributeName, attributeValue, encode);
    else
        control.Page.ClientScript.RegisterExpandoAttribute(control.ClientID, attributeName, attributeValue, encode);
}

谢谢你的回复,但是,当我尝试这种方法时,同样的问题发生了。如果我在异步回发中,我最初遇到的问题是ScriptManager.RegisterExpandoatAttribute没有添加该属性。在ajax请求之后,我会丢失属性,脚本管理器也不会重新添加它。我想我可以做的是注册一个启动脚本,然后手动添加属性,我很确定这会起作用,但是如果能找到为什么RegisterExpandoAttribute不能帮我这么做,那就太好了。嗯,这很奇怪了。我不知道Telerik RadButton继承层次结构,但正如您所知,expando属性是在
WebControl
的重写
AddAttributesToRender
方法中注册的。可能,telerik也有相同的功能,或者如果它们也继承自
WebControl
,那么您可以尝试覆盖
AddAttributesToRender
。如果有机会,我会尝试添加
Dim radContextMenu作为radContextMenu=Parent.FindControl(ContextMenud)如果radContextMenu不是空的,那么writer.AddAttribute(“ContextMenuClientID”,radContextMenu.ClientID)将在我能够让它工作时结束。我不得不稍微修改我的JS,改为使用element.getAttribute(“ContextMenuClientID”),但效果一样,我更喜欢它,而不是我的hack:)谢谢你的回复,但是,当我尝试这种方法时,同样的问题发生了。如果我在异步回发中,我最初遇到的问题是ScriptManager.RegisterExpandoatAttribute没有添加该属性。在ajax请求之后,我会丢失属性,脚本管理器也不会重新添加它。我想我可以做的是注册一个启动脚本,然后手动添加属性,我很确定这会起作用,但是如果能找到为什么RegisterExpandoAttribute不能帮我这么做,那就太好了。嗯,这很奇怪了。我不知道Telerik RadButton继承层次结构,但正如您所知,expando属性是在
WebControl
的重写
AddAttributesToRender
方法中注册的。可能,telerik也有相同的功能,或者如果它们也继承自
WebControl
,那么您可以尝试覆盖
AddAttributesToRender
。如果有机会,我会尝试添加
Dim radContextMenu作为radContextMenu=Parent.FindControl(ContextMenud)如果radContextMenu不是空的,那么writer.AddAttribute(“ContextMenuClientID”,radContextMenu.ClientID)将在我能够让它工作时结束。我不得不稍微修改一下我的JS,改为使用element.getAttribute(“ContextMenuClientID”),但工作原理相同,我更喜欢它,而不是我的hack:)