Menschen als einen Suchbereich angeben / Inhaltsquelle mit SharePoint 2013 REST-API

Ich hatte Grund mit SharePoint arbeiten 2013 Such-API über REST zum ersten Mal. Ich wollte nach Personen suchen, keine Dokumente. Die Taste lernen ist hier, dass geben Sie Content-Quellen über seine GUID (oder zumindest in diesem Fall). Die folgende jQuery Ausschnitt zeigt wie:

    loadExpertsAsync: Funktion() {

        jQuery.support.cors = wahr;

        $.AJAX({
            URL: Dies.CreateFullApiUrl() +
                "?Querytext = 'Portale'&SourceID = 'b09a7990-05ea-4af9-81ef-edfab16c4e31'" +
                "&Selectproperties ='LinkedInProfileUrl,GoogleCirclesProfileUrl,BALargeProfilePictureUrls,BAGridPictures,WorkEmail,Fähigkeiten,AboutMe,Interessen,JobTitle,PastProjects,Bild-URL,PreferredName,TwitterHandle,LinkedInProfileUrl,PreferredName,GoogleCirclesProfileUrl'" +
                "&ROWLIMIT = 99",
            Methode: "Erhalten",
            Header: { "Akzeptieren": "Application/json; promoveaza = verbose" },
            Cache: falsch,
            Erfolg: Funktion (Ergebnis) {

In meinem Fall, Ich bin die API für SharePoint online ausgeführt. Um die GUID zu erhalten, Ich Schritte diese:

  1. Zugang zum SharePoint Administrationscenter
  2. Klicken Sie auf "Suche" aus der linken Navigationsleiste
  3. Wählen Sie "Ergebnis Quellen verwalten"
  4. Wählen Sie "Einheimischen Ergebnisse"
  5. Sehen Sie sich die URL.

Meine URL sah so etwas wie:

https://xyzzy-admin.sharepoint.com/_layouts/15/searchadmin/EditResultSource.aspx?level=tenant&sourceid=b09a7990%2D05ea%2D4af9%2D81ef%2Dedfab16c4e31&view=1

Parameters Sourceid ist was für mich gearbeitet.

(Ich verstehe, dass die Sourceid tatsächlich eine Art permanente mit SP sein kann, aber ich werde sowieso immer überprüfen 🙂 ).

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Beispiel SharePoint REST Aufrufe

Hier ist eine Reihe von Beispiel-REST-Aufrufe, die Arbeit für mich und kann Ihnen helfen, sich auch. Als der 02/2014, gibt es zwei Beispiele 🙂

  1. Eine Spalte mit Leerzeichen im Namen verweisen
  2. Eine Mehrfachauswahl Spalte verweisen
  3. Führen Sie eine Personensuche über REST

 

Ich füge dazu wie die Zeit vergeht.

Hier sind einige nützlichen Tinten habe, die ich auch gefunden:

Eine Spalte mit Leerzeichen im Namen verweisen

Erstellen Sie eine benutzerdefinierte Liste, mit einer Spalte mit dem Namen "Blog-Autor" (Abstand zwischen Blog und Autor).

$select auf diese Spalte verwiesen wird:

image

Ersetzen Sie einfach den Raum mit "_x0020_". Wir sehen die _x0020_ in vielen Beispielen über den Internets und REST ist nicht anders.

Wenn Sie das nicht tun, Sie sind verpflichtet, eine Fehlermeldung wie diese:

Der Ausdruck “Blog-Autor” ist nicht gültig.

Einfach genug.

Referenz einer Mehrfachauswahl Nachschlagespalte

Einrichten:

  1. Erstellen einer benutzerdefinierten Liste mit dem Namen Categories.
  2. Einige Kategorien hinzufügen. Ich fügte Kategorien Wasserverbrauch:image
  3. Erstellen Sie eine andere benutzerdefinierte Liste mit der Bezeichnung MockBlog und fügen Kategorien als multi-select-Listenspalte hinzu (oder Websitespalte wenn es das ist, wie Sie Rollen).

Einige Elemente in Ihre Mockblog-Liste einfügen und fertig.

Ein Ajax-Stil-Aufruf mit jQuery wird wie folgt aussehen:

ServerUrl  = "/_api/Web/Listen/GetByTitle('MockBlog')/Elemente" +
             "?$Wählen Sie = Title,Kategorien/Titel,Blog_x0020_Author/Titel" + 
             "&$Erweitern Sie = Blog_x0020_Author,Kategorien";

Wir sagen SharePoint "geben Sie mir den Titel für alle Kategorien (Kategorien/Titel). Erhalten Sie die tatsächlichen Werten für Titel von $Erweitern SieIng der Liste Kategorien." (Meine erholsamen paraphrasieren ist wohl ziemlich locker, Aber wie ich es interpretieren bin).

Wenn du das tust, mit JavaScript und mit Fiddler um zu betrachten, die Ausgabe, Sie bekommen so etwas im Gegenzug:

 

image

(Das oben genannte ist ein JSON-Objekt)

Führen Sie eine Personensuche über REST

Ich gebloggt dazu separat. Der Schlüssel ist einen Sourceid-Parameter festgelegt, deren Wert die GUID der einheimischen Inhaltsquelle ist. (Content-Quellen verwendet, um die Bereiche bezeichnet werden und es ist so schwer, oh-mein nicht alles aufrufen, einen Bereich für mich!).

Mehr dazu lesen sie hier: http://www.mstechblogs.com/paul/?p=10385

 

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Schnell und einfach: Erstellen einer SharePoint-Website, die Verwendung von REST

Gibt es eine Menge Ressourcen um, die zeigen, wie Sie dies tun, aber ich konnte einen umfassenden gehe-zu-Link finden, Hier sind wir.

Sie können eine SharePoint-Website mithilfe der REST-API erstellen.  Hier ist ein vollständig gebackene Beispiel:

<!--
    SiteRequestForm.html: Informationen sammeln und Erstellen einer Website für den Benutzer.
-->

<Zentrum>
<Tabelle>
    <TR>
        <TD>Site-Name:</TD>
        <TD><Eingang Typ= "text" Name= "SiteName" ID= "SiteName" /></TD>
    </TR>
    <TR>
        <TD colspan= "2">
            <Eingang Typ= "submit" ID= "CreateSiteButton" Wert= "Erstellen die Website" />
        </TD>
    </TR>
</Tabelle>
</Zentrum>

<Skript src="../Plugins/jQuery-1.11.0.Min.js"></Skript>

<Skript>
var CreateSiteLogicContainer = {

    createSiteData: {
            "Parameter": {
                __metadata: { "Typ": "SP.WebInfoCreationInformation" },
                URL: "Paultest1",
                Titel: "Paultest1",
                Beschreibung: "Rest-erstellt Web von Paul!",
                Sprache: 1033,
                WebTemplate: "sts",
                UseUniquePermissions: falsch
            }
    },

    createSite: Funktion () {

        jQuery.support.cors = wahr;

        CreateSiteLogicContainer.createSiteData.parameters.Url = $("#SiteName").Val();
        
        $.AJAX({
            URL: "https://bigapplesharepoint.sharepoint.com/NBAIADev/_api/web/webinfos/add",
            Methode: "POST",

            Header: {
                "akzeptieren": "Application/json; promoveaza = verbose",
                "Content-type": "Application/json;promoveaza = verbose",
                "X-RequestDigest": $(#__REQUESTDIGEST"").Val()
            },

            Daten: JSON.stringify(CreateSiteLogicContainer.createSiteData),

            Erfolg: Funktion () { Warnung("Erfolg"); },
            Fehler: Funktion () { Warnung("Fehler"); }

        });
    },

    wireUpForm: Funktion () {
        $("#CreateSiteButton").Klicken Sie auf(Funktion () {
            Warnung("Zu versuchen und Erstellen der Site.");
            CreateSiteLogicContainer.createSite();
        });
    }


}

CreateSiteLogicContainer.wireUpForm();

</Skript>

Wenn Sie erfolgreich sind, Sie erhalten ein JSON-Paket als Antwort wie folgt:

image

Meine wichtigsten Gedanken und Erkenntnisse aus diesem include:

  • Dieser Ansatz verwendet jQuery.  In meinem Fall, meine jQuery-Bibliothek befindet sich im ".../ Plugins. "  Sie wollen das darauf zu Ihrem Lieblings-JQ-Standort ändern.
  • Sie können kopieren und fügen Sie ganze Ausschnitt in einem Inhalts-Editor-Webpart auf einer Seite und es sollte gut funktionieren.  Sie wollen den Endpunkt der API-Aufruf zu ändern und sicherstellen, dass Sie korrekt JQ verweisen.
  • Die URL ist relativ Ihre API-Endpunkt.  In meinem Fall, Es ist Sub-Sites unter erstellen. https://bigapplesharepoint.com
  • Du musst eine Inhaltslänge bieten. Einige Blog-Posts und MSDN Dokument impliziert, dass Sie tun, aber geschah für mich automatisch, welche ich annehme werden durch den Aufruf der $-Schnipsel selbst behandelt.
  • Diese Linie wird benötigt, um eine "Verbotene" Antwort zu vermeiden: "X-RequestDigest": $(#__REQUESTDIGEST"").Val().  Es gibt andere Wege, es zu tun, aber das ist ziemlich nett.  Ich habe den Link zum Blog verloren, die diese Verknüpfung bereitgestellt.  H/T auf Sie, geheimnisvolle blogger!

Viel Glück und hoffe, dass dies jemand hilft.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Überwinden Sie lästiges Problem mit relativen Urls in SharePoint Quick Launch

Ich wollte die Schnellstart-Navigation neulich einen Link hinzu und SharePoint erzählte mir:

image

Reine Textversion, die ist:

Sicherzustellen Sie, dass die URL gültig ist und mit entweder ein gültiges Zeichen beginnt (ein Nummernzeichen (#) oder Schrägstrich (/)) oder eine gültige unterstützte Protokoll (zum Beispiel, "http://’, "Https://’, ' Datei://’, "ftp://’, "Mailto:’, ' Nachrichten:’).

"Blech und pox!"Ich sagte.

Ein Workaround zu diesem soll JavaScript verwenden, um eine bekannte Verknüpfung in der Schnellstartleiste finden, und überschreiben Sie sein Verhalten.

Um dies zu testen, Wasserverbrauch Ihrer Test-Website einen neuen Link hinzufügen:

image

Ich habe jQuery. Um es zu lösen, einige JavaScript und jQuery Shape auf das Zeichenblatt verwenden Ihre bevorzugte Technik und mit einer Codezeile wie folgt:

 

$(Dokument).bereit( Funktion () {

    $("eine:enthält('Test URL Ersatz')").Klicken Sie auf(Funktion () { Warnung("geänderte Click-Verhalten!"); Rückkehr falsch;});

});

Und Bob ist dein Onkel.

Die jQuery-Auswahl findet jeder <eine> Tag, das "Test-URL Ersatz" in seinem Namen hat. Möchten Sie möglicherweise suchen-, die abhängig von Ihrer Verbindung und diese Melodie.

Die Click…(Funktion() überschreibt, was SharePoint getan hätte, wenn der Benutzer geklickt hat. Stellen Sie sicher, dass Sie "false zurück," Es wird deine Sachen zu tun und dann versuchen, die Href-Sache zu, Das ist sicherlich nicht Ihr Ziel.

Dies geschah und Test in einer SharePoint-online-Umgebung sollten aber funktionieren gut in 2010 und früher zu.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Schnell und einfach: SharePoint REST rufen nur gibt 100 Datensätze

Ich habe an einer öffentlichen ausgerichteten Website für meine SharePoint-Praxis hier in gearbeitet New York und verwendet eine Menge JavaScript und REST Anrufe auf Inhalt anzeigen.

Während der Hauptstrecke Entwicklung, Ich erstelle eine kleine Dataset mit nur 10 oder Zeilen in einer benutzerdefinierten Liste und meine REST-Anrufe alle so gezogen, von dort.  Einmal traf ich auf der Liste, um ein paar hundert Zeilen von Daten zum Testen für das erwartete Wachstum haben, Ich fand, dass ich genau bekam 100 wieder auf meine Anrufe REST zurückgegebenen Zeilen.

Dies ist eine sehr einfache Sache zu Adresse.  In meinem Fall (und ich glaube, in den meisten Fällen), Standardmäßig ruft REST in SharePoint (und möglicherweise als Branchenstandard?) Rückkehr 100 Zeilen.  Mehr als der Standardwert zurückgegeben, mithilfe des Parameters $top auf Ihren Anruf, wie in:

/Insights Dev/_api/web/lists/GetByTitle zu erhalten('MockBlog')/Elemente?$Wählen Sie = ID,Titel,Kategorien/Titel,Blog_x0020_Author/Titel,DatePublished,BlogSummary&$Erweitern Sie = Blog_x0020_Author,Kategorien&$Filter =&$oben = 9999

Ich nahm 9999 in diesem Fall da ich weiß, die growth-wise, Es werden nicht mehr als 200 oder also Zeilen in einem Jahr in diese Liste aufgenommen.  Wenn es plump wird, Wir realisieren eine Auslagerungsdatei auf der Straße.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Schnell und einfach: Lösen Sie "Ungültiger URL-Parameter” Problem mit UpdateListItems in lists.asmx

Beim Arbeiten mit UpdateListItems über lists.asmx, Es ist einfach, den Fehler zu generieren:

Ungültiger URL-Parameter.

Die bereitgestellte URL enthält einen ungültigen Befehl oder Wert. Bitte überprüfen Sie die URL erneut.

Sie können diesen Fehler erhalten, wenn Sie vergessen, ID in enthalten die die Liste der Felder aktualisieren.  Dies, wie viele dieser SP Webdienste, ist ein wenig counterintuitive, da Sie die ID in das ID-Attribut des einschließen müssen die <Methode> Element.  Und du bist nicht aktualisiert ID und wahrscheinlich nie in erster Linie möchten.

Diese SOAP-Envelope arbeitet:

<soapenv:Umschlag xmlns:Soapenv =' http://Schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Körper>                      
    <UpdateListItems Xmlns =' http://Schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <Aktuelles>                     
         <Batch-OnError ="Weiter">
          <Methoden-ID ="1" Cmd ="Update">
            <Feldname ="CooperativeLock">gesperrt!</Feld>
            <Feldname ="ID">1</Feld>
          </Methode>
        </Batch>                     
        </Aktuelles>                
      </UpdateListItems>             
  </soapenv:Körper>         
</soapenv:Umschlag>

Wenn Sie den ID-Feldverweis entfernen dann erhalten die lästige Meldung "Ungültiger URL-Parameter" Sie.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

 

Armer Mann ist in JavaScript Zwischenspeichern.

[TL;DR-version: Verwenden Sie Cookies zum Speichern der Ergebnisse der asynchrone Aufrufe; die Ergebnisse der letzten asynchrone Aufrufe sofort gerendert, und überprüfen sie dann nach dem Laden der Seite.]

Ich habe auf SharePoint-Intranet-Site für einen Client, dass die Funktionen gearbeitet, unter anderem, eine stilisierte Sekundärnavigation dessen Menüoptionen über eine normale alte benutzerdefinierte Liste verwaltet werden.  Die Idee besteht darin, dass der Client "ihre" Site-Menü steuern, ohne zu beeinflussen oder durch die globale Navigation löschte dadurch beeinträchtigt wird.

(Es ist etwas unglaublich subversiven zum Hinzufügen eines CEWP, der auf einer HTML-Datei verweist, das lädt einige CSS und JS grundlegend verändern fast alles über eine Website Verhalten... aber das ist für einen anderen Beitrag)

Der Code für diese ziemlich einfach:

Die Wunde Punkt hier ist das jedes Mal, wenn jemand eine der Seiten hits, Web-Browser des Benutzers greift Elemente aus der Liste abgerufen.  Sobald Dev vollständig und Tests sind bewährt Dinge zu stabil und vollständig sein, Dieser Aufruf ist unnötig mehr als 99% die Zeit, da das Menü nur selten ändert.  Es hat auch einen seltsamen UI Affekt, der in dieser schönen neuen Welt von hyper-Ajaxy Websites üblich ist – die Seite macht und erst dann rendert das Menü.  Es ist nervös und störend aus meiner Sicht.  Und nervös. Also, Zwischenspeichern. 

Ich änderte die Logik Wasserverbrauch:

  • Suchen Sie ein Cookie im Browser, der Menü enthält, wie ich es zuletzt gelesen
    • Wenn gefunden, machen Sie es sofort.  Warten Sie nicht auf die Seite geladen.  (Sie müssen sicherstellen, dass Ihre HTML hier strategisch ist, aber es ist nicht schwer zu tun).
  • Warten Sie, bis die Seite fertig geladen und machen ein Async aufrufen, um Menüelemente aus einer Liste mit REST oder lists.asmx oder was auch immer zu laden
  • Vergleichen Sie, was ich mit dem cookie
    • Wenn es passt, STOP
    • Ansonsten, mithilfe von jQuery, ein paar dynamisch zu füllen, wenn <Li>ist in einem <UL>
  • Verwenden Sie CSS, um die Formatierung zu tun
  • Gewinn!

Einige von Ihnen werden sagen, "hey! Es gibt kein richtiger Zwischenspeichern hier da du sowieso das Menü liest jedes Mal.”  Und du hast Recht-ich gebe nicht dem Server jede Art von Bruch.  Aber weil der Aufruf asynchron und geschieht, nachdem die Seite erste ist rendert HTML-Nutzlast voll, es "fühlt"sich stärker auf den Benutzer.  Das Menü macht ziemlich viel wie die Seite zieht.  Wenn das Menü zur Änderung geschieht, der Benutzer wird eine unruhige neu zu ziehen des Menüs unterzogen, aber nur dieses eine Mal.

Es gibt einige Möglichkeiten, um diese Zwischenspeicherung effizienter und helfen den Server zur gleichen Zeit:

  • Setzen Sie in der Regel, dass der "Cookiecache" gültig für einen Mindestaufenthalt von ist 24 Stunden oder einige andere Zeitrahmen. Solange es keine abgelaufene cookie, Verwenden Sie das Cookie Menü Snapshot und nie schlagen Sie den server.

Nun... das ist alles, die was gerade in den Sinn kommen :). 

Wenn jemand hier eine clevere Idee hat würde ich gerne kennenlernen.

Und schließlich – kann diese Technik für andere Sachen verwendet werden.  Dieser Client-Seite hat eine Reihe von datengesteuerten Dingen auf verschiedenen Seiten, viele von ihnen ändern relativ selten (wie einmal pro Woche oder einmal im Monat).  Wenn Sie bestimmte Bereiche der Funktionalität gezielt, Sie können eine reaktionsschnellere Benutzeroberfläche geben, ziehen Inhalte aus dem lokalen Cookie laden und Rendern sofort.  Es fühlt sich schneller an den Benutzer, auch wenn Sie nicht den Server Schleifen speichern.  Sie können sparen Sie die Serverzyklen bei Entscheidung über einige Bedingungen und Auslöser dieser lokalen Cookiecache für ungültig erklären.  Das ist alles situationsabhängig und künstlerisch Zeug und wirklich am meisten Spaß :). 

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

So wird es gemacht: Konfigurieren von Komponententests und Testabdeckung mit QUnit.js und Blanket.js für ein Büro 365 SharePoint-Webanwendung

Intro

Ich habe bereits erkundet Komponententests und Testabdeckung für JavaScript, wie ich an einem neuen SharePoint-app für SharePoint online im Büro arbeite 365 Suite.  Die offensichtliche Forschungs-Pfade führte mich zu Qunit.js und danach rechts, An Blanket.js.

QUnit Lass mich richten Sie Komponententests und in Module zu gruppieren.  Ein Modul ist nur eine einfache Möglichkeit, ähnliche Tests zu organisieren. (Ich weiß nicht, ob ich es verwende, wie beabsichtigt, aber es funktioniert für mich bisher mit den kleinen Satz von Tests, die ich bisher definiert haben).

Blanket.js Qunit integriert, und es zeigt mir die tatsächlichen Zeilen JavaScript, die – und vor allem waren nicht wirklich hingerichtet wurden im Laufe der Tests ausgeführt werden.  Das ist "Deckung"-Linien, die ausgeführt werden durch den Test abgedeckt, während andere nicht sind.

Zwischen guten Testfälle einrichten und anzeigen Abdeckung, Wir können das Risiko verringern, dass unser Code Mängel versteckt hat.  Gute Zeiten.

Qunit

Vorausgesetzt, Sie haben Ihre Visual Studio Projekt einrichten, durch das Herunterladen der JavaScript-Pakets aus starten http://qunitjs.com.  Die JavaScript und entsprechende CSS zur Projektmappe hinzufügen.  Bergwerk sieht wie folgt:

image

Abbildung 1

Wie Sie sehen können, Ich benutzte 1.13.0 damals schrieb ich in diesem Blog-post. Vergessen Sie nicht, laden und fügen Sie die CSS-Datei.

Das aus dem Weg, nächste Schritt ist eine Art Testumgebung zu erstellen und verweisen die Qunit-Bits.  Ich teste eine Reihe von Funktionen in einer Skriptdatei namens "QuizUtil.js", so dass ich eine HTML-Seite namens "QuizUtil_test.html erstellt" wie gezeigt:

image Abbildung 2

Hier ist der code:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<Kopf>
    <Titel>QuizUtil Test mit Qunit</Titel>
    <Verbindung rel= "stylesheet" href="../CSS/qunit-1.13.0.CSS" />
    <Skript Typ= Text/javascript"" src="QuizUtil.js" Daten-cover></Skript>
    <Skript-Typ ="Text/javascript" Src ="Qunit-1.13.0.js"></Skript>
    <Skript-Typ ="Text/javascript" Src ="blanket.min.js"></Skript>

    <Skript>
        Modul("getIDFromLookup");
        Test("QuizUtil getIDFromLookupField", Funktion () {
            var GoodValue = "1;#Paul Galvin";

            gleich(getIDFromLookupField(goodValue) + 1, 2), "Die ID des [" + goodValue + "] + 1 sollte 2";
            gleich(getIDFromLookupField(undefiniert), undefiniert, "Undefined Eingabeargument sollte nicht definierte Ergebnis zurückgeben.");
            gleich(getIDFromLookupField(""), undefiniert, "Leere Eingabeargument sollte einen nicht definierten Wert zurückgeben.");
            gleich(getIDFromLookupField("gobbledigood3-thq;Dkvn ada;Skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), undefiniert,"Sollte immer ein Ergebnis-Cabrio in eine ganze Zahl zurück");
            gleich(getIDFromLookupField("2;#eine andere person"), "2", "Checking [2;#eine andere person].");
            gleich(getIDFromLookupField("9834524;#Long-Wert"), "9834524", "Großen Wert Test.");
            notEqual(getIDFromLookupField("5;#Jeder", 6), 6, "Eine NotEqual-Prüfung (5 ist nicht gleich 6 für dieses Beispiel: [5;#Jeder]");

        });

        Modul("htmlEscape");
        Test("QuizUtil htmlEscape()", Funktion () {
            gleich(htmlEscape("<"), "&lt;", "Eine kleiner als-Operator-escaping ('<')");
            gleich(htmlEscape("<Div Class =  "Someclass">Text</div>"), "&lt;Div-Klasse =&quot;SomeClass&quot;&gt;Text&lt;/div&gt;", "Komplexer TestString.");
        });

        Modul("getDateAsCaml");
        Test("QuizUtil getDateAsCaml()", Funktion () {
            gleich(getDateAsCaml(Neu Datum("31.12.2013")), "2013-12-31T:00:00:00", "Testen hart codierte Datum: [12/31/2013]");
            gleich(getDateAsCaml(Neu Datum("01/05/2014")), "2014-01-05T:00:00:00", "Testen hart codierte Datum: [01/05/2014]");
            gleich(getDateAsCaml(Neu Datum("01/31/2014")), "2014-01-31T:00:00:00", "Testen hart codierte Datum: [01/31/2014]");
            gleich(getTodayAsCaml(), getDateAsCaml(Neu Datum()), "getTodayAsCaml() GetDateAsCaml sollte gleich sein.(neuer Termin())");
            gleich(getDateAsCaml("Unsinn Wert"), undefiniert, "Versuchen Sie, das Datum eines Unsinn-Wertes erhalten.");
            gleich(getDateAsCaml(undefiniert), undefiniert, "Versuchen, das Datum von der [undefiniert] Datum.");
        });

        Modul("getParameterByName");
        Test("QuizUtil getParameterByName (aus der Abfragezeichenfolge)", Funktion () {
            gleich(getParameterByName(undefiniert), undefiniert, "Versucht nicht definiert Parameter sollten undefined zurück.");
            gleich(getParameterByName("does not exist"), undefiniert, "Versuchen Sie, den Wert des Parameters zu erhalten, wenn wir wissen, dass der Parameter nicht vorhanden ist.");

        });

        Modul("Cookies");
        Test("QuizUtil verschiedene Cookie-Funktionen.", Funktion () {
            gleich(setCookie("test", "1", -1), getCookieValue("test"), "Get ein Cookie eingestellte sollte funktionieren.");
            gleich(setCookie("anycookie", "1", -1), wahr, "Einstellung eines gültigen Kochen sollte zurückgeben 'true'.");
            gleich(setCookie("crazy Cookie-name !@#$%"%\^&*(()?/><.,", "1", -1), wahr, "Einen schlechten Cookienamen festlegen sollte 'false' zurückgeben.");
            gleich(setCookie(undefiniert, "1", -1), undefiniert, "Passing als Cookie-Name nicht definiert.");
            gleich(getCookieValue("does not exist"), "", "Cookie existiert nicht Test.");
        });

    </Skript>
</Kopf>
<Körper>
    <div ID= "qunit"></div>
    <div ID= "Qunit-Leuchte"></div>

</Körper>
</HTML>

Es gibt mehrere Dinge, die hier passiert:

  1. Verweisen auf meinen code (QuizUtil.js)
  2. Verweisen auf Qunity.js
  3. Einige Module definieren (getIDFromLookup, Cookies, und andere)
  4. Platzierung einer <div> dessen ID ist "Qunit".

Dann, Ich ziehe einfach auf diese Seite und Sie erhalten etwas:

image

Abbildung 3

Wenn Sie, im oberen suchen, Sie haben ein paar Optionen, zwei davon sind interessant:

  • Ausblenden bestanden: Ziemlich offensichtlich.  Hilft Ihr Auge nur die Problembereiche und keine Menge Unordnung zu sehen.
  • Modul: (Drop-down-): Dies wird die Tests bis auf genau diese Gruppen von Tests zu filtern gewünschten.

Für die Tests selbst – einige Anmerkungen:

  • Selbstverständlich müssen Sie den Code zu schreiben, so dass es in erster Linie testbar ist.  Mit dem Tool kann helfen, diese Disziplin zu erzwingen. Zum Beispiel, Ich hatte eine Funktion namens "getTodayAsCaml()”.  Das ist nicht sehr getestet werden, da es keine Eingabeargument nimmt und es auf Gleichheit zu testen, Wir müssten den Testcode entsprechend das aktuelle Datum ständig zu aktualisieren.  Ich umgestaltet es, indem ein Daten-input-Parameter hinzufügen dann das aktuelle Datum wann ich heute in CAML-Format will übergeben.
  • Qunit Rahmen dokumentiert seine eigene Tests und es scheint ziemlich robust.  Es kann einfache Dinge wie auf Gleichheit testen und hat auch Unterstützung für Ajax-Stil-Aufrufe ("echte" oder verspottet mit Ihrer bevorzugten mocker).
  • Durch den Prozess auch zwingt Sie zu durchdenken Rand Fällen – was passiert mit "nicht definiert" oder Null an eine Funktion übergeben wird.  Es macht es tot einfach zu diesen Szenarien heraus zu testen.  Gute Sachen.

Abdeckung mit Blanket.js

Blanket.js ergänzt Qunit durch die Verfolgung der tatsächlichen Codezeilen, die im Laufe der Ausführung Ihres Tests ausführen.  Es integriert in Qunit, obwohl es eine ganz separate app ist Recht, Es spielt schön – es sieht wirklich wie es eine nahtlose app ist.

Das ist blanket.js in Aktion:

image Abbildung 4

image

Abbildung 5

(Sie haben tatsächlich klicken Sie auf das Kontrollkästchen "Enable Abdeckung" an der Spitze [siehe Abbildung 3] um dies zu ermöglichen.)

Die hervorgehobenen Zeilen in Abbildung 5 haben von einem meiner Tests nicht ausgeführt wurde, Also muss ich einen Test zu entwickeln, der sie ausgeführt werden, wenn ich volle Deckung will verursacht.

Blanket.js arbeiten mit den folgenden Schritten zu erhalten:

  1. Laden Sie es von http://blanketjs.org/.
  2. Dem Projekt hinzufügen
  3. Aktualisieren Sie Ihrer Testseite Kabelbaum (QuizUtil_test.html in meinem Fall) wie folgt:
    1. Der Referenzcode
    2. Dekorieren Sie Ihre <Skript> So verweisen:
    <Skript Typ= Text/javascript"" src="QuizUtil.js" Daten-cover></Skript>

Blanket.js nimmt das Attribut "Daten-Cover" und hat seinen Zauber.  Es hängt in Qunit, Aktualisiert die Benutzeroberfläche um die Abdeckung Option "Aktivieren" hinzuzufügen und voila!

Zusammenfassung (TL; DR)

Verwenden Sie Qunit, um Ihre Testfälle zu schreiben.

  • Laden Sie es
  • Dem Projekt hinzufügen
  • Schreiben Sie eine Testseite Kabelbaum
  • Erstellen Sie Ihre tests
    • Umgestalten Sie einige der Code testbar sein
    • Seien Sie kreativ!  Denken Sie an verrückt, unmöglich Szenarien und testen sie auf jeden Fall.

Verwenden Sie blanket.js, um die Abdeckung zu gewährleisten

  • Stellen Sie sicher, dass Qunit funktioniert
  • Download blanket.js und dem Projekt hinzufügen
  • Ihre Test-Harnisch-Seite hinzufügen:
    • Fügen Sie einen Verweis auf blanket.js
    • Fügen Sie ein Attribut "Daten-Cover" zu Ihrem <Skript> Tag
  • Führen Sie die Qunit-tests.

Ich nie habe nichts davon vor und hatte einige rudimentäre Sachen arbeiten in wenigen Stunden. 

Viel Spaß beim Testen!

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Der letzte Anzug tragen Sie je?

[Kurzer Hinweis: Dies ist ein ziemlich langer Post auf ein Stellenangebot für meine Fraktion hier in New York und du musst im Tri-State Area Leben, wenn Sie daran interessiert sind.]

Ich trat Slalom Consulting, über 18 vor Monaten und das macht dies meine längsten Arbeit seit 2007. Ich habe nicht vor es auf diese Weise. Vor einer Reihe von Stelle zu hüpfen, mit meinem Sprung in die SharePoint-Welt gestartet, Ich war elf Jahre lang an einem Ort. Ich habe endlich eine neue gefunden, dauerhaften Arbeitsplatz für die Langstrecke hier im Slalom.

Dieser Ort wächst und ich benötige Hilfe, die Steuern. Die Art von Hilfe brauche ich wird in der Regel eine "SharePoint Solutions Architect" genannt, obwohl ich gefunden habe, das Architekt Wort über und/oder falsch verwendet werden im Bereich SharePoint seit geraumer Zeit nun. Ich habe darüber, wie über diesen Blog gekämpft. Ich möchte nicht einfach eine Reihe von Aufzählungszeichen in Würfel/Monster Stil auflisten. Hervorragenden Einstellung Kollegen haben bereits getan, dass :). Also, Ich beschloss, einen "Tag im Leben"-Ansatz. Lesen Sie es und betrachten:

1) Wenn es gefällt und

2) Ob Sie in Ihre Knochen wissen, dass Sie es tun können.

Wenn ja, Kontaktieren Sie mich (Paul.Galvin@Slalom.com) und Let 's talk.

Das sind, was Sie erwarten können, zu tun, typische Woche/Monat als ein Lösungsarchitekt in meinem team:

  • Projekte, oft mehr als ein zu einer Zeit. Einige Projekte sind groß und so würden Sie selbst dieses eine Projekt. "Running" ein Projekt bedeutet, dass Sie Aufsicht und Verantwortung für die Qualität der Lieferung. In fast jedem Fall hast du eine PM und ein wirklich starkes Team von Devs, BAs, UX-Menschen, usw.., um Sie zu unterstützen. Aber Sie werden die wichtigsten Gesicht sieht der client, Vertrauensstellungen, usw.. Es gibt keine verstecken in den Schatten in dieser Rolle :). Sie werde diesmal bill und das Ziel ist, halten Sie beschäftigt genug, dies zu tun 80 Prozent der Zeit.
  • Hilfe bei Formalitäten – Sauen, Ausschreibungen, Decks – alles, was good stuff. Ich denke, wir haben unsere SOW-Prozess ziemlich eng und solide ist es ziemlich formelhaften. Wenn Sie sind, gewohnt zu schreiben, heute Sauen, Unser Prozess wird keine Herausforderung für Sie sein. Ausschreibungen – das sind ein bisschen schwerer. Sie neigen dazu, in der Natur von Anfang an maßgeschneidert werden und RFPs ziehen in der Regel in mehrere verschiedene Autoren. Es ist sowohl gute als auch schlechte, aber vor allem gut. Dies kann scrambly erhalten, wenn wir die Notwendigkeit für exzellenten Kundenservice und gleichzeitig versuchen, neue Arbeit zu gewinnen Jonglieren müssen. Sie werden nicht wahrscheinlich ein RFP besitzen, aber werden Sie aufgefordert, die Abschnitte beitragen.
  • Verkaufsgespräche, aber nicht unter die Lupe. Im Laufe eines Monats, Sie können erwarten, gehen Sie auf ein paar Verkaufsgespräche mit unserem sales-team. Sie werden die KMU im Zimmer, machen Sie sich Notizen und gestalten Sie die Lösung. Jedoch, Sie werden nicht gefragt oder voraussichtlich den Verkaufsprozess von Anfang bis Ende zu behandeln. Du musst nicht "verkaufen,"Du brauchst nur die ruhige Stimme der Experte Grund im Zimmer sein. Dies baut Vertrauen und das ist, warum du bist es. Natürlich, Wenn Sie verkaufen möchten, dann gibt es Platz für Sie, hier zu wachsen.
  • Hilfe bei der Rekrutierung. Wir haben eine Art von Referral-Programm, Also wenn du wirklich weißt starke Leute in der Gemeinschaft, die Sie denken Slalom sollten, Sie können auf diese Weise profitieren.. Wir haben engagierte Personalvermittler (Wer ausgezeichnet sind) der Löwenanteil dieser Art von Arbeit zu tun. Die echte Hilfe ist die Befragung Kandidaten – sind sie eine gute Passform kulturell? Kennen sie ihre Sachen? Können sie machen * meine * das Leben leichter? 🙂 This comes in spurts, ein paar Mal im Monat, Obwohl in einigen Monaten Sie es überhaupt nicht hätte.
  • Helfen bewährte Methoden definieren, unsere IP bauen Sie auf und machen Sie uns wettbewerbsfähiger zu, auf dem Markt. Du bist ein erfahrener Kerl/Gal.. Sie überboten wurden, um den Block – nicht nur in SharePoint, aber Sie haben Erfahrung in anderen Technologien und lebte über gut und Böse (sogar schrecklich) Projekte über. Als Folge, Sie wissen, was funktioniert und was nicht. Wir sollten Sie auf einen Tag für Tag in einem taktischen Sinn diese Erfahrung mit uns teilen (dh. Führen Sie Ihre Projekte wirklich gut) aber auch strategisch. "Best Practices" ist als Begriff ein wenig überstrapaziert und ich zögern, es zu benutzen. Die Grundidee ist, dass Sie als eine erfahrene Person mit Tiefe und einschlägigen Erfahrung kommen und wir das Beste aus Ihrer Erkenntnisse integrieren wollen, wie wir mit Kunden, die auf einer täglichen Basis engagieren.
  • Viel Spass – Wir sind ein sehr integrierte Bündel. Ich möchte noch eine Plattitüde zu vermeiden, aber es ist in diesem Fall wirklich apt-wir arbeiten hart (Art der) und wir spielen noch härter :). Es gibt eine Art Aaron Sorkin Geplänkel hier, Das Zimmer ist immer voll von klugen Menschen, Wir mögen unser Getränk und wir organisieren eine angemessene Anzahl von Spaß Veranstaltungen – Filmabend, Baseball-Reisen (auch wenn Sie schrecklich, praktisch böse Mannschaften).

Wenn ich es alles in einem Wort zusammenfassen könnte, Ich würde das Wort "Führung." verwenden. Führen Projekte, nehmen Sie eine führende Rolle im Gebäude der Praxis (IP, Aufbau des Teams), usw..

Aber warten! Es gibt noch mehr! Warum sonst arbeite bei Slalom?

  • Bemerkenswerte Einheit der Absicht – jeder will dieses Ding heraus zu wachsen. "Diese Sache" ist das New Yorker Büro. Jeder ist an Bord, mit diesem.
  • Wind in Ihre Segel – Schwester Büros, Schwester Praktiken – Slalom ist ein "full Service" Beratung Organisation. Ich führe die SharePoint-Praxis (eine "Praxis Bereich führen" in Slalom-Jargon). Ich habe Schwester Praktiken auf 11 Weitere Slalom-Büros. Also obwohl ich König soweit bin ist SharePoint hier Slalom New York besorgt, Ich habe Peer Praktiken in Chicago, Seattle, Dallas, Atlanta, Boston, usw.. aus dem kann ich auf Unterstützung zurückgreifen.. Es ist wirklich das Beste aus beiden Welten – erhebliche Autonomie hier in New York aber Zugriff auf Tonnen von Talent in der gesamten Organisation.
  • Wind in Ihren Umsatz (2) – Wir tun mehr als SharePoint-viel mehr. Wir tun BI, CRM, UX, Unternehmensberatung, Handy, kundenspezifische Entwicklung und andere. Wir sind gut im cross-selling unter uns und wir sind gut bei Malerei- und vor allem, auf – ein "full Service" Bild für unsere Kunden zu liefern. Dies ist besonders attraktiv für mich. Ich habe bei vielen kleineren Orgs, die auf SharePoint-Konzerte und frustriert immer und immer wieder arbeiten, denn wir waren Taube führen, die als die "SharePoint Leute." Das passiert nicht mit Slalom und wir erhalten dadurch interessanter Arbeit zu tun.
  • Lokale Modell – keine Reise.
  • Langfristiges Wachstum – hat Slalom boomen schon. Viel Wachstum und Stabilität. Wachstum bedeutet auch, dass wir Führer heute an die Spitze neue Teams zu mieten, da wir mehr Kunden und Mitarbeiter zur Unterstützung dieser Clients hinzufügen.

Ich könnte weitermachen, aber ich bin wahrscheinlich schon auf zu lange gegangen. Ich denke, dass ich das wesentliche hier aufgenommen haben. Wenn Sie, über denken aussieht wechselnde Arbeitsplätze und dies gut für Sie, Let 's talk.

Wenn Sie zufrieden in Ihrem aktuellen Beruf – reden wir sowieso :). Ich habe in vielen Orten und war damals sehr "glücklich". Slalom ist anders und ich würde begrüßen, eine Chance, Sie davon zu überzeugen.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Schnell und einfach: Legen Sie die Größe von einem Elementen in einem Listenfeld in ein Windows-Speicher-App

In einer Windows-Speicher-App bin ich der Erstellung, Ich möchte dem Benutzer verschiedene Informationsmeldungen zeigen.  Ich habe eine ListBox als Werkzeug um es zu zeigen, so dass sie durch Sie und alles, was good Stuff zu blättern. 

Die Nachrichten sind nur zu Informationszwecken, Also gibt es keine Notwendigkeit, alle, dass zusätzliche Leerräume um sie herum zu bieten, da der Benutzer nie für etwas auswählen kann.  Das Standardverhalten der ListBox bietet umfangreiche Polsterung und ich wollte es loswerden.  Nun.... so etwas auf die ListBox geht direkt nicht.  JEDOCH, Du kannst es an den Elementen machen, die Sie hinzufügen:

        Privat privatevoid AddGameStateLogMessage(Zeichenfolge Ermittelt)
        {
            TextBox t = Neu TextBox();
            t.Text = GameStateCounter    + ": " + Ermittelt;
            t.TextWrapping = TextWrapping.Wrap;
            t.MinWidth = 400;
            Dicke ThisPadding = Neu Dicke(5, 0, 5, 0);
            t.Padding = ThisPadding;
            t.FontSize = 12;

            ListBoxItem li = Neu ListBoxItem();
            Li.Content = t;
            Li.MaxHeight = 25;
            ThisPadding = Neu Dicke(5, 0, 5, 0);
            Li.Padding = ThisPadding;

            GameStateLog.Items.Insert(0,Li);
        }

in den oben genannten, Ich bin ein Textfeld erstellen und Festlegen der Schriftart, die Polsterung, usw..

Nächste, Ich eine ListBoxItem erstellen und legen ihren Inhalt auf die formatierte TextBox.

Schließlich, Ich legen ListBoxItem in der ListBox.  (Ich möchte die neuesten Einträge am oberen Rand der Liste zeigen, daher die Einfügung(0,Li) statt einer einfachen hinzufügen() Aufruf.).

Ich wird dies Optimierungen werden, ein bisschen, bevor ich wirklich glücklich mit dem ListBox-Verhalten bin, aber das Muster oben abgebildet ist sehr fruchtbar gewesen.  Hoffentlich findet jemand anderes es hilfreich.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin