Load usercontrol i webpart asynkron

by Jess Lassen 11. December 2009 09:36

Siden sidste blog indlæg i oktober, har vi fået et indblik i hvordan næste version af Sharepoint (2010) kommer til at se ud. Blandt mange forbedringer, er specielt integrationen til Visual Studio blevet forbedret markant. Jeg har tidligere snakket om muligheden for at bruge usercontrols i webparts og det ser ud til, at Microsoft også syntes det er en glimrende ide, i det de har introduceret Visual Web Parts i Sharepoint 2010. Der er ikke noget hokus pokus i Visual Web Parts måde at loade usercontrols på, den loader såmænd bare usercontrollen i webpartens CreateChildControls() metode og skubber dermed ansvaret videre til usercontrollen.


Load usercontrols asynkront.

Herunder vil jeg vise en metode jeg har brugt til at hente usercontrols ind i webparts asynkront. Dette kan forbedre sidens loadtid og give slutbrugeren en bedre oplevelse af løsningen.

Webpartens opgave er stadig at loade usercontrol, men bare asynkront istedet. Dette gøres ved at implementere ICallBackEventHandler.
CreateChildContols() opgave er nu at registrere scripts og rendere en placeholder div til usercontrollen. Dette kan gøres således.


protected override void CreateChildControls()
{
  string strScript = string.Format(@"
  function ServerRequest(arg,ctx) {{ {0}; }}
  function GetResult(result, context) {{ document.getElementById('divResult').innerHTML = result }}
  function GetError(result, context) {{ alert(result); }}"
,
  Page.ClientScript.GetCallbackEventReference(this, "arg", "GetResult", "ctx", "GetError", false));
  Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallbackFunctions", strScript, true);
  Page.ClientScript.RegisterStartupScript(this.GetType(), "ExecuteCallback", "ServerRequest('1','');", true);
}

protected override void Render(HtmlTextWriter writer)
{
  writer.Write(@"<div id=""divResult""><br /><img src=""/_layouts/images/CRPERSPC.GIF"" /></div>");
}

string callBackString = string.Empty;
public string GetCallbackResult()
{
  return callBackString;
}

public void RaiseCallbackEvent(string eventArgument)
{
  StringBuilder sb = new StringBuilder();
  UserControl.xxx ctrl = this.Page.LoadControl("/_controltemplates/xxx/xxx.ascx") as UserControl.xxx;
  if (ctrl != null)
  {
    this.Controls.Add(ctrl);
    using (StringWriter tw = new StringWriter(sb))
    {
      using (HtmlTextWriter hw = new HtmlTextWriter(tw))
      {
        ctrl.RenderControl(hw);
      }
    }
  }
  callBackString = sb.ToString();
}

Som resulterer i følgende mens usercontrollen ("Nyheder") loades:

Og resultatet viser når usercontrollen er loadet færdig.

Tags: , ,

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

RecentPosts