Content Query Webpart via code op een pagina

Tussen de opdrachten door ben ik bezig het provisioning proces van een Sharepoint 2010 public facing website te automatiseren. Een van de onderdelen die hier bij hoort is het plaatsen van de verschillende webparts op de pagina’s.

Tijdens het plaatsen van de custom CQWP’s kwam ik er achter dat dit niet allemaal zo goed werkte. De webparts werden namelijk niet geplaatst en ik kon niet direct uitvinden waarom dit het geval was. Na een zoektocht kwam ik op het weblog van Waldek uit waar hij een mogelijke oplossing voor het probleem heeft, zie: https://blog.mastykarz.nl/inconvenient-provisioning-content-query-web-part-instances/. Hij heeft namelijk ook problemen gehad met het plaatsen van een CQWP op een pagina. Volgens hem komt het probleem voort uit het feit dat de HttpContext eerst leeg moet worden gevuld met informatie van de huidige gebruiker:

It turns out that each time you instantiate’SPSite’the SharePoint Object Model reuses the context information if available. And if the context information you provided doesn’t contain any information on the current user, the created reference will be as it was called by an anonymous user! The HttpContext.Current property is static so it will remain available during the whole deployment process unless you explicitly clear it. Back in June I provided you the following code snippet to imitate the context data:

Gelukkig biedt hij ook de code aan welke gebruikt kan worden. Zelf heb ik de code enigszins aangepast, zodat het beter in m’n applicatie past. Voor referentie doeleinden, hier ook de code die ik zelf heb gebruikt:

bool contextCreated=false;

if (HttpContext.Current==null)
{
    HttpRequestrequest = newHttpRequest("",_currentWeb.Url,"");
    HttpContext.Current = new HttpContext(request, new HttpResponse(new StringWriter()));
    HttpContext.Current.Items["HttpHandlerSPWeb"] = _currentWeb;
    contextCreated=true;
}

En uiteraard de code om de context weer leeg te maken:

if (contextCreated)
{
    HttpContext.Current = null;
}

Beide code blokken moeten worden aangeroepen, anders heb je kans dat de HttpContext problemen gaat opleveren in de rest van de code.


Share