具有许多用户控件的sharepoint webpart

时间:2012-03-30 14:40:54

标签: c# sharepoint user-controls web-parts

我在VisualStudio2010中创建了具有三个用户控件(.ascx)的sharepoint 2010 visual webpart。我想通过单击当前加载的usercontrol处的某个按钮来动态更改webpart中的usercontrol。主要问题在于,只有在执行CreateChildControls方法(我尝试使用ViewData获取所需的usercontrol)之后才处理buttonClick事件。有谁可以帮我解决这个问题?

3 个答案:

答案 0 :(得分:1)

李的反应基本上是正确的,可能对你有用。但是,你不应该只使用__doPostBack并依赖它总是“神奇地”为你。 Lee提到的这个方法和变量是ASP.NET内部的,它们不能直接使用。此外,如果您没有在页面上放置任何回发控件,则此方法实际上不会生成,并且调用它的代码将失败。

幸运的是,导致和处理通用回发的代码非常简单。而不是使用输入控件的内置事件处理程序(需要在触发之前构造 - 因此在调用处理程序之前调用CreateChildControls),而不是将回发定位到Web部件本身:

public class MyWebPart : WebPart, IPostBackEventHandler {
    protected override void CreateChildControls() {
        Control clickable = ...; // Create a clickable control.
        // Get JavaScript expression to send postback "test" to "this" web part.
        var postBack = Page.ClientScript.GetPostBackEventReference(this, "test");
        clickable.Attributes["onclick"] = postBack + "; return false";
        Controls.Add(clickable);
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
        if (eventArgument == "test") { // Recognize and handle our postback.
           ...
        }
    }
}

GetPostBackEventReference将为您生成必要的JavaScript表达式。 (实际上,只需调用它就会使__doPostBack“神奇地”显示在页面上。)RaisePostBackEvent将在OnLoadOnPreRender之间调用。确保在此之前不要导致创建子控件(例如,通过调用EnsureChildControls或通过任何其他方式)。如果您需要多个回发控件,eventArguments参数将让您在它们之间有所不同。

您需要在用户控件中使用回发​​触发器,而不是直接在Web部件中。我在Web部件中展示它只是为了保持简单。您可以将GetPostBackEventReference的结果放到任何控件上,以便在调用时使用正确的Page和Web部件实例。

---费达

答案 1 :(得分:0)

执行此操作的方法是让按钮调用javascript函数,然后调用以下内容:

__doPostBack('LoadControl', 'ControlName');

然后,您可以使用服务器变量__EVENTTARGET和__EVENTARGUMENT来查找要在CreateChildControls事件处理程序中加载的控件。

答案 2 :(得分:0)

我也有这个问题。

将此添加到事件处理程序(在处理程序中执行代码之后)

this.Page.Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri, true);

此致

佩德罗