Zoals in m’n vorige post is te lezen ben ik momenteel bezig met het maken van een nieuwe Windows Phone 7 applicatie met het MVVM pattern. Op zich niet zo heel spannend, aangezien er duizenden anderen zijn die dit ook doen.
Enkele jaren geleden heb ik geleerd om m’n applicatie in meerdere logische lagen of tiers op te delen, presentatie-, business- en data-laag. Ik ben nog steeds een groot voorstanden van dit principe en of je hier nu lagen of tiers gebruikt, beide keren moet er data van 1 klasse naar een andere worden gestuurd.
Dit wil ik nu dus ook toepassen binnen m’n Windows Phone 7 applicatie. Eerst heb ik nu een nieuw MVVM Light project gemaakt met daarin de benodigde onderdelen voor m’n applicatie. Daarna heb ik gelijk een business en een data laag er bij gemaakt. Tegenwoordig heb je ook de keuze om een Windows Phone Class Library te maken:

Hier heb ik dan ook voor gekozen, omdat deze er standaard voor zorgt dat ik niet alle assemblies van .NET 3.5 kan kiezen en dus een dll maak die geschikt is voor een WP7 apparaat. Het resultaat is ongeveer als volgt:

Aangezien ik jarenlang aan webdevelopment heb gedaan in ASP.NET en Sharepoint 2007/2010 ben ik niet meer zo in de loop van asynchroon werken en het gebruik van meerdere threads binnen je code. Met Silverlight ontkom je hier niet aan, dus heb ik m’n kennis aardig moeten bijspijkeren. Vandaag heb ik ongeveer de gehele dag besteedt om communicatie tussen m’n lagen aan de praat te krijgen. Na veel voorbeelden te hebben gelezen, ge iplementeerd en verwijderd te hebben, heb ik nu toch iets werkends kunnen maken. Of het helemaal goed is, dat is een tweede. Waarschijnlijk kijk ik over een jaar hier heel anders tegen aan, maar momenteel ben ik er tevreden mee.
Read more →Deze dagen ben ik weer druk doende met een nieuwe Windows Phone 7 applicatie. De vorige applicatie die ik had gemaakt was nogal haastig in elkaar gezet, zonder ook maar een enkel pattern of framework te gebruiken, echt een Hello World dus.
Nu betreft het een tweede applicatie bezig voor m’n werk en die moet toch van iets hogere kwaliteit zijn. Een collega van me had al een framework gevonden dat ons kon helpen met het MVVM pattern dat veel wordt gebruikt bij Silverlight en WPF applicaties, namelijk MVVM Light. Het duurde even voordat ik alles op het systeem had staan. Het installeren staat goed beschreven op de site van Galasoft: https://www.galasoft.ch/mvvm/installing/manually/
Let er hier ook op dat de hotfix voor Windows Phone 7 ontwikkeling wordt geinstalleerd:
Important note for Windows Phone developers: If you work with Windows Phone 7, you must install this hotfix on top of V3 SP1.
Wanneer dit niet is gedaan krijg je foutmeldingen tijdens het maken van een nieuw MVVM Light WP7 project.
Zodra de bestanden goed op het systeem staan kan er worden begonnen met ontwikkelen. Er is een nieuw project template beschikbaar, namelijk MvvmLight (WP7).

Dit project bevat gelijk al een tweetal mappen, Model en ViewModel en een XAML bestand.
Read more →Het standard menu van Sharepoint 2010 is op zich prima voor interne sites, echter bij een publieke website wil je hier wel het een en ander aan styling toepassen. Het standaard menu uit Sharepoint 2007 is gelukkig helemaal verbeterd en is tegenwoordig een stuk beter te stylen.
Het menu wordt gedefinieerd als een SharePoint:AspMenu. Dit is eigenlijk gewoon een asp:AspMenu met enkele uitbreidingen voor Sharepoint. Je kunt hier zelf niet van overerven, aangezien het een sealed class is. Er zijn her en der wel oplossingen te vinden waar men uiteindelijk toch in staat is geweest om de code van het menu over te erven. Wanneer er alleen wat gestyled moet worden is dat niet direct nodig, hoewel ik denk dat het toch wel handig kan zijn.
Omdat je eigenlijk werkt met een asp:AspMenu, kun je dus ook je eigen templates maken. Van onze designer had ik de opdracht gekregen dat het menu als hieronder moest worden gerenderd:
<ul class="">
<li class="selected_menu_item"><a href="/default.aspx">home</a>
<li class="selected_menu_item"><a href="/Pagina/zwanger.aspx">zwanger</a>
<li class="selected_menu_item"><a href="/Pagina/baby.aspx">baby</a>
<li class="selected_menu_item"><a href="/Pagina/peuter.aspx">peuter</a>
<li class="selected_menu_item"><a href="/Pagina/schoolgaand_kind.aspx">schoolgaand kind</a>
<li class="selected_menu_item"><a href="/Pagina/puber.aspx">puber</a>
<li class="selected_menu_item"><a href="/Pagina/jong_volwassene.aspx">jong volwassene</a>
</ul>
Tijdens m’n ASP.NET tijd had ik al geleerd dat je in het asp:AspMenu gebruik kunt maken van het ItemTemplate blok. Het enige dat ik hoefde te doen is de header en footer (de UL-elementen) boven en onder het menu te plaatsen.
Uiteindelijk is er deze code uit gekomen:
Read more →Dat is de melding die je zo nu en dan ziet verschijnen bij het overnemen van een server via remote desktop. Tot op heden was m’n enige oplossing hiervoor om met /console in te loggen en wanneer dat ook niet meer werkte, dan maar de server herstarten.
Vandaag kwam ik dit probleem weer tegen, maar dit keer was het op een host van verschillende VMWare guests. Het was niet echt een optie om de server te herstarten.
Gelukkig ben ik er nu achter gekomen dat je ook via de commandline de openstaande sessies kunt opvragen en killen.
Open de command prompt. Let er hier op dat je de deze wel opent als een domein gebruiker als de server op een domein zit, of anders als een gebruiker die ook op de server bekend is. Wanneer je dit niet doet kun je een Access denied melding krijgen.
Error 5 getting sessionnames
Error [5]:Access is denied.
Het starten van een applicatie met een ander account kan door de [Shift]+[Rightclick] te doen op de applicatie of snelkoppeling. Je krijgt dan een Run as different user optie in het context menu (Windows 7). Uiteraard kan er ook gebruik worden gemaakt van de ShellRunas applicatie van Sysinternals.
Read more →In Sharepoint 2010 is de handige ribbon aanwezig om acties te kunnen voltooien op de website. Voor de publieke website die ik momenteel aan het ontwikkelen ben is het niet nodig dat anonieme gebruikers deze ribbon krijgen te zien. Het past immers niet echt in de stijl van de website, anonieme gebruikers kunnen er niets mee, waardoor het alleen maar afleidt.
Gelukkig is er tegenwoordig een oplossing voor die out of the box kan worden gebruikt, namelijk het volgende stukje code:
<Sharepoint:SPSecurityTrimmedControl runat="server" Permissions="ManageLists">
Put Your Control Here
<SharePoint:SPSecurityTrimmedControl>
Uiteraard kan deze code voor veel meer dingen worden gebruikt dan alleen de ribbon. Zoals altijd, gebruik dit met mate!
Mogelijke waarden die kunnen worden gebruikt bij het attribuut Permissions zijn te vinden op deze MSDN pagina.
Voor de volledigheid, hier ook het overzicht dat momenteel op de pagina staat:
| Member name | Description |
|---|
| EmptyMask | Available in SharePoint Online Has no permissions on the Web site. Not available through the user interface. |
| ViewListItems | Available in SharePoint Online View items in lists, documents in document libraries, and view Web discussion comments. |
| AddListItems | Available in SharePoint Online Add items to lists, add documents to document libraries, and add Web discussion comments. |
| EditListItems | Available in SharePoint Online Edit items in lists, edit documents in document libraries, edit Web discussion comments in documents, and customize Web Part Pages in document libraries. |
| DeleteListItems | Available in SharePoint Online Delete items from a list, documents from a document library, and Web discussion comments in documents. |
| ApproveItems | Available in SharePoint Online Approve a minor version of a list item or document. |
| OpenItems | Available in SharePoint Online View the source of documents with server-side file handlers. |
| ViewVersions | Available in SharePoint Online View past versions of a list item or document. |
| DeleteVersions | Available in SharePoint Online Delete past versions of a list item or document. |
| CancelCheckout | Available in SharePoint Online Discard or check in a document which is checked out to another user. |
| ManagePersonalViews | Available in SharePoint Online Create, change, and delete personal views of lists. |
| ManageLists | Available in SharePoint Online Create and delete lists, add or remove columns in a list, and add or remove public views of a list. |
| ViewFormPages | Available in SharePoint Online View forms, views, and application pages, and enumerate lists. |
| Open | Available in SharePoint Online Allow users to open a Web site, list, or folder to access items inside that container. |
| ViewPages | Available in SharePoint Online View pages in a Web site. |
| AddAndCustomizePages | Available in SharePoint Online Add, change, or delete HTML pages or Web Part Pages, and edit the Web site using a SharePoint Foundation compatible editor. |
| ApplyThemeAndBorder | Available in SharePoint Online Apply a theme or borders to the entire Web site. |
| ApplyStyleSheets | Available in SharePoint Online Apply a style sheet (.css file) to the Web site. |
| ViewUsageData | Available in SharePoint Online View reports on Web site usage. |
| CreateSSCSite | Available in SharePoint Online Create a Web site using Self-Service Site Creation. |
| ManageSubwebs | Available in SharePoint Online Create subsites such as team sites, Meeting Workspace sites, and Document Workspace sites. |
| CreateGroups | Available in SharePoint Online Create a group of users that can be used anywhere within the site collection. |
| ManagePermissions | Available in SharePoint Online Create and change permission levels on the Web site and assign permissions to users and groups. |
| BrowseDirectories | Available in SharePoint Online Enumerate files and folders in a Web site using Microsoft Office SharePoint Designer 2007 and WebDAV interfaces. |
| BrowseUserInfo | Available in SharePoint Online View information about users of the Web site. |
| AddDelPrivateWebParts | Available in SharePoint Online Add or remove personal Web Parts on a Web Part Page. |
| UpdatePersonalWebParts | Available in SharePoint Online Update Web Parts to display personalized information. |
| ManageWeb | Available in SharePoint Online Grant the ability to perform all administration tasks for the Web site as well as manage content. Activate, deactivate, or edit properties of Web site scoped Features through the object model or through the user interface (UI). When granted on the root Web site of a site collection, activate, deactivate, or edit properties of site collection scoped Features through the object model. To browse to the Site Collection Features page and activate or deactivate site collection scoped Features through the UI, you must be a site collection administrator. |
| UseClientIntegration | Available in SharePoint Online Use features that launch client applications; otherwise, users must work on documents locally and upload changes. |
| UseRemoteAPIs | Available in SharePoint Online Use SOAP, WebDAV, or Microsoft Office SharePoint Designer 2007 interfaces to access the Web site. |
| ManageAlerts | Available in SharePoint Online Manage alerts for all users of the Web site. |
| CreateAlerts | Available in SharePoint Online Create e-mail alerts. |
| EditMyUserInfo | Available in SharePoint Online Allows a user to change his or her user information, such as adding a picture. |
| EnumeratePermissions | Available in SharePoint Online Enumerate permissions on the Web site, list, folder, document, or list item. |
| FullMask | Available in SharePoint Online Has all permissions on the Web site. Not available through the user interface. |
Read more →In Sharepoint 2010 is het nu mogelijk om gebruik te maken van webtemplates. Zoals ik het zie is dit een evolutie van een Site template en een site definitie, maar er zijn genoeg anderen die hier een betere uitleg over kunnen geven, Mirjam geeft hier bijvoorbeeld een goede uitleg over: Post 1 & Post 2.
Omdat het gebruik van een webtemplate wel heel handig lijkt, heb ik dan ook besloten om dit te gebruiken voor het provisionen van m’n Sharepoint 2010 website(s).
Het kan kan gewoon door het plaatsen van een leeg element binnen je solution en deze in een feature te plaatsen. Dit ga ik hier niet beschrijven, omdat er al andere blogs zijn die dit goed hebben gedaan, zie bijvoorbeeld Stefan Stanev’s blog.
Komt er eigenlijk gewoon op neer dat je een nieuw element maakt en hier een onet.xml in plaatst en de bijbehorende bestanden:

Let hier wel op dat met een webtemplate geen modules kunnen worden ge-provisioned. Het is dus waarschijnlijk verstandig om de default.aspx te verwijderen en de onet.xml aan te passen dat de modules niet meer worden gebruikt.
De opmaak van het Elements.xml kan wel uit een van de eerdere gelinkte posts worden gehaald.
Na activatie van de wsp zullen alle features binnen de solution worden geactiveerd binnen de site collectie (heb als target de Site genomen). Een prima manier om je webtemplate uit te rollen en daarom ging ik ook verder met de bouw.
Read more →Ik heb enkele features gemaakt welke worden geactiveerd bij het aanmaken van een nieuwe site. Voor de zekerheid controleer ik hier of de aangemaakte website wel van het type PublishingWeb is, dit kan gelukkig heel eenvoudig met PublishingWeb.IsPublishingWeb.
Nu had ik de code in debug redelijk goed doorgelopen en werkte alles ook naar behoren. Tijdens het testen liep ik echter tegen wat vreemde problemen aan. De subsites werden maar half gevuld. Omdat ik hier tijdens het debuggen nooit last van had gehad vond ik dat nogal vreemd. Gelukkig wordt er in m’n feature redelijk wat gelogd, dus kon het probleem snel worden gevonden. Blijkbaar waren de aangemaakte sites niet een PublishingWeb. Omdat ik er zeker van ben dat dit wel het geval is, moest het dus wel een ander probleem zijn. Gelukkig ben ik niet de enige die hier last van heeft gehad en zijn er menige posts te vinden waar dit probleem in wordt beschreven.
Het komt er op neer dat na het aanmaken van een nieuwe PublishingWeb er op de achtergrond nog het een en ander gebeurd en er op een timerjob moet worden gewacht voordat de nieuwe PublishingWeb ook goed kan worden herkend.
Dit is ook de reden waarom de methode wel goed werkt in een while-loop, omdat je daar in kunt blijven totdat je eindelijk een true terug krijgt. In een productie web-omgeving lijkt me dat niet echt een ideale situatie en zou ik het gebruik van een dergelijke while-loop constructie ook afraden.
Het is in ieder geval iets om rekening mee te houden wanneer je een Sharepoint 2010 website aan het provisionen bent.
Read more →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:
Read more →
Tijdens de installatie van Forefront kon ik niet de hele tijd het internet op, omdat dat werd geblokkeerd door de firewall. Reuze handig en veilig, maar niet echt handig wanneer er een probleem moet worden opgelost.
Tijdens het spelen met de IP eigenschappen van de m’n laptop stuitte ik ineens op de eigenschappen van IPv4.
Hier zag dat ik daar meerdere IP adressen kan toevoegen aan de NIC, ook is het mogelijk om meerdere gateway, DNS en WINS servers te definieren. Dit had ik al een keer gedaan voor DNS servers, maar nog nooit bij stil gestaan dat je ook meerdere IP’s aan een NIC kan toekennen.
Dit heb ik dus gedaan om te kijken of het ook daadwerkelijk werkt. Zo heb ik de instellingen als hieronder opgeslagen:

Na het opslaan zie je dat de NIC ineens 2 netwerken heeft, ‘Jan_V’ en ‘Jan_V 2’

Er wordt nu door Windows gevraagd wat het nieuwe netwerk is (Home, Work, Public) en wanneer je daar iets hebt gekozen kun je het internet op. Dit was reuze handig in mijn situatie. Wel heb ik nog even een route toegevoegd dat verkeer van 10.0.0.x wel via de juiste gateway moest, anders zouden er misschien rare situaties kunnen optreden.
Read more →Enkele weken terug heb ik Forefront TMG geinstalleerd. Reden hiervoor was dat ik iets nodig had dat http-redirection kan doen, omdat ik meerdere websites wil hosten vanuit m’n interne netwerk. Dit kan natuurlijk via de router, maar die doet alleen port forwarding. Aangezien niet alle websites op dezefde server komen te staan kon ik hier weinig mee.
Bij het maken van de http regels kreeg ik in de logging van Forefront continu de melding ‘TMG is Unable to Listen on Port 80 (no IIS was not installed)’. Dit vond ik een rare melding, aangezien IIS gewoon was geinstalleerd. Ook host ik geen websites op de Forefront server, dus snapte het probleem niet echt. Gelukkig ben ik niet de eerste die tegen dit probleem aanliep en was er een artikel geschreven op TechNet hoe dit kon worden getackeld.
Blijkbaar zijn er verschillende services die op poort 80 luisteren, waardoor ForeFront hier geen ownership op kan krijgen of iets dergelijks.
Gelukkig kon ik aan de hand van de beschrijving in het artikel weer verder en werkt de site-forwarding nu prima.
Read more →