Archiv der Kategorie: SharePoint-Entwicklung

HTTP 406 Fehler bei der Verwendung von eckigen $http.get gegen SharePoint-REST-Endpunkte

Update: Marc AD Ndersson wies darauf hin, dieses großartige Stück info: http://Blogs.Office.com/2014/08/13/JSON-Light-Support-Rest-SharePoint-API-Released/. Das erklärt einiges :).

Das ist der schlechteste Titel der einen Blog-Post je! Wie auch immer.

Ich tun in der Regel alle meine Prototypen gegen eine O365-Instanz. Ich habe meine persönliche Instanz, so dass ich nicht besorgt über die Auswirkungen auf jemand anderes sein. Als Nebenwirkung – denken Sie daran, wenn wir für unsere Laptops mit Moos – durchgeführt, um virtuelle Maschinen aufrufen SQL Server, IIS, Entscheidung über Hyper-V-vs. VMWare? Wie auch immer...

Ich hatte eine app mit Angular in diesem Umfeld, das entwickelt, unter anderem, Dies:

$http.Get(serverUrl)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.value.forEach(Funktion(i) {

// und so weiter und so Schaum

Dies war nur in zwei verschiedenen SharePoint online-Umgebungen adaequat. Jedoch, Wenn es mein Kollege auf eine Cloudshare-Instanz portiert., Er war immer ein HTTP 406 Fehler (Das war das erste Mal habe ich nie, dass man, Also... Yay, Ich vermute). Wir haben ein wenig Forschung und bemerkte, dass die "Accept"-Header Weg war. SharePoint online war vollkommen zufrieden mit:

Akzeptieren: Application/json

Aber die Cloudshare Instanz (Prem ist die SP, auf einem virtuellen Server gehostet) wollte das klassische "promoveaza = verbose" sowie in hinzugefügt:

Akzeptieren: Application/json;promoveaza = verbose

Zu reparieren, Wir haben den Header als solche:

Var-Config = {Header: {
'Akzeptieren': "Application/Json;promoveaza = verbose'
}
};

$http.Get(serverUrl,config)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.value.forEach(Funktion(i) {

// und so weiter und so Schaum

Entledigte sich die 406, aber auch das Format der Antwort geändert. Es war mehr... ausführlich. (haha!) Weitere Änderungen sind erforderlich, und hier ist das Endergebnis:

Var-Config = {Header: {
'Akzeptieren': "Application/Json;promoveaza = verbose'
}
};

$http.Get(serverUrl,config)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.d.results.forEach(Funktion(i) {

// und so weiter und so Schaum

Es stellte sich nur in einem 30 Minute Problem für uns, so dass wir Glück gehabt. Hoffentlich findet jemand diese nützliche.

</Ende>

Wachsendes Bewusstsein / Annahme des JavaScript-Frameworks

Mein Kollege, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), schrieb eine kurze Zusammenfassung Blog-Post über Rahmenbedingungen, die er mag oder zumindest nutzt mit mit SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery scheint der Sieger auf dem Feld gewesen, sozusagen, seit Jahren, aber die anderen sind immer neue und Stills kämpfen sie irgendwie, wie Angular. (SPServices, Natürlich, seit Jahren ist er ein Lebensretter und wird weiterhin sein, also denke ich).

Was Menschen verwenden? Sie sind mehr auf Microsofts Werkzeuge konzentriert (CSOM / JSOM) oder mehr in Richtung Angular bewegen, Knockout, Ember, usw.?

Ich habe eine wachsende Tendenz in Richtung dieser nicht-Microsoft-frameworks. Ich finde das Zeug MSFT schwieriger und schwieriger zu arbeiten, die fast genauso viel Lernaufwand als altmodische serverseitige dev.

Schreiben Sie einen Kommentar hier oder bei Big Apple-SharePoint Wenn Sie diskutieren wollen (Big Apple haben mehr Wahrscheinlichkeit von eine gute Diskussion).

</Ende>

SharePoint-Timerdienst Stellenangebote von Collection-Standortkonfiguration Spinnerei

Mein Kollege, Ashish Patel, hat eine Blog-post Beschreibung eine flexible Timer Job Architektur Das bietet einige schöne Flexibilität, langwierige Aufgaben bzw. Berichte zu unterstützen.  In seinen Worten:

1. Analysieren markierte Dateien und Erinnerungen an die Personen senden, wenn die Anzahl der Tage (Da die Datei ausgecheckt wurde) bestimmte Schwellenwerte überschreiten

2. Entfernen von Links von anderen Inhalten, wenn eine bestimmte Inhalte entfernt oder aus dem System archiviert

3. Benutzer möchte alle Warnungen zu sehen, die er in alle Webs in der Websitesammlung abonniert

4. Senden eine Erinnerungen an Autoren, den Inhalt zu überprüfen, wenn eine Zeit für die Prüfung des Inhalts angegeben wurde und das Datum rückt näher

Gut, die Liste geht weiter...

– Sehen Sie mehr auf: http://www.bigapplesharepoint.com/ Seiten/Ansicht-An-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Es gibt Zeiten in meiner Vergangenheit als mit sowas sehr hilfreich gewesen wäre.

</Ende>

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

Lists.asmx, GetList und "Wert darf nicht null sein”

Heute entdeckte ich, dass die GetList() Methode in lists.asmx Es ist anfällig für eine geheimnisvolle "Wert darf nicht null sein" Ausnahme auslösen oder Webdienst hat sehr sorgfältig aufgerufen werden (und das geht davon aus, dass Sie vorbei die schlimmer generische Fehlermeldung erhalten können, "Ausnahme des Typs ' Microsoft.SharePoint.SoapServer.SoapServerException’ ausgelöst wurde.")  Speziell, Ich fand, dass Sie keine Art von Präfix auf die GetList-Methode bereitstellen können.  Der folgende jQuery-Ausschnitt zeigt die:

image

Wenn Sie das tun, der Webdienst antwortet mit "Wert darf nicht null pro dies als sein" Fiddler-bereitgestellten HTTP-Protokoll:

<?XML Version = "1.0" Encoding = "Utf-8"?>
  <Seife:Umschlag
     xmlns:Seife ="
http://Schemas.xmlsoap.org/SOAP/Envelope/"    
     xmlns:Xsi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <Seife:Körper>
    <Seife:Fehler>
      <FaultCode>Seife:Server</FaultCode>
      <faultString>
        Ausnahme des Typs ' Microsoft.SharePoint.SoapServer.SoapServerException’ ausgelöst wurde.
      </faultString>
      <Detail>
        <ErrorString Xmlns ="
http://Schemas.Microsoft.com/SharePoint/SOAP/">
Wert darf nicht null sein..
        </ErrorString>
      </Detail>
    </Seife:Fehler>
  </Seife:Körper>
</Seife:Umschlag>

Natürlich, Sie würde nicht das Präfix "s0" wahrscheinlich auf eigene hinzufügen., aber einige Werkzeuge sind dafür anfällig (wie Eclipse).

Dies ist umso mehr verwirrend / frustrierend, da andere Methoden Präfixe tolerieren.  Zum Beispiel, die GetListCollection Methode dagegen nicht, wenn es vorangestellt worden ist, auch mit Unsinn Präfixe wie "Xyzzy":

image

Diese "Wert darf nicht null sein" scheint ziemlich häufig mit lists.asmx so hoffentlich dies jemand in Zukunft helfen wird.

</Ende>

Onnieren Sie meinen Blog ab.

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

Endlos Schachteln <div> Markierungen und jQuery

Dies scheint, wie so ein Spinner-Thema, Ich bin nicht sicher, dass es wirklich lohnt, über das Bloggen, aber das hat nie aufgehört mich vor, So hier gehen wir Lächeln

Ich bin an einem Projekt arbeiten wo ich einige Daten von einer Suche ziehen bin, Verpackung es bis in eine XML-Nachricht und dann die XML sich letztlich verwandelt in HTML via XSLT.  Es gibt eine Menge von jQuery beteiligt, ein wenig davon implementiert einige der Tab-Taste Funktionen.  Wenn Sie auf eine Registerkarte klicken (wirklich, eine <div>), jQuery ruft .hide() und ...zum() auf verschiedenen divs (der erste Seite laden lädt alle Inhalte, so gibt es in diesem Fall keine postbacks).

Ein paar Stunden, die Registerkarte Schaltlogik Schritte auffälliges Verhalten und es würde nicht eine meiner Registerkarten zeigen.  Ich verfolgt letztlich es bis auf die Tatsache, dass InternetExplorer (mindestens) dachte, dass die <div> Tags geschachtelt weit, weit tiefer als beabsichtigt.Die Developer Toolbar zeigen würde:

-<Div Id = "Tab1Content">
  -<div>
    -<div>
      -<Div Id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— endlich zeigt es hier ganz unten geschlossen wurde!

Also, Wenn ich habe ein $("# Tab1Content").Ausblenden(), Ich würde auch Tab2 verstecken und ich könnte nie Tab2 zeigen, wenn ich nicht auch Tab1 zeigen.  Ich Kopieren und Einfügen den Code bis in visual Studio und es zeigte alle die Div Futter bis schön, so, wie sie angeblich zu tun, wie folgt aussehen:

-<Div Id = "Tab1Content">
  +<div>
  +<div>
-<Div Id = "Tab2Content">
  +<div>
  +<div>

Ich schlug meinen Kopf gegen die Wand für eine Weile und bemerkte, dass in der eigentlichen HTML Code eine Menge von leeren generiert wurde <div> Schlagwörter, wie:

<Körper>

  <Div Id = "Tab1Content">

    <Div Id = "row1" />
    <Div Id = "row2" />

  </div>

  <Div Id = "Tab2Content">

    <Div Id = "row1" />
    <Div Id = "row2" />

  </div>

</Körper>

(Das oben genannte ist Waaaaaaaaaaaay vereinfacht.  Die leere Div-Tags sind völlig gültig. Einige meiner <div> Markierungen waren voll von Inhalten, aber viel mehr nicht.  Ich kam zu der Erkenntnis, dass mein <XSL:für jeden> Richtlinien wurden die Kurzform ausgeben Div-tags wenn die XSL-Datei:für jede nicht ' finden Sie alle Daten.  Die Ausgabe einen HTML-Kommentar gezwungen, wie gezeigt:

image

 

Nachdem ich den tat, des Div schön aufgereiht und begann meine Tab switching.

Wie immer, Ich hoffe, dass dieses Hilfen im Notfall.

</Ende>

Onnieren Sie meinen Blog ab.

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

Eine Ursache für "der Schöpfer dieses Fehlers keinen Grund angegeben haben.”

Ich mache eine Menge Arbeit mit SharePoint-Suche in letzter Zeit und insbesondere die KeywordQuery-Klasse, Eigenschaften und Methoden.

Möchten Sie das Resultset wieder Ergebnisse jenseits der üblichen Verdächtigen (siehe hier), Sie hinzufügen sie der Auflistung SelectedProperties, wie in:

myKeywordQuery.SelectProperties.Add("Xyzzy");

Vielen Dank und eine Spitze des Hutes zu Corey Roth und Diese enorm hilfreich Blog-post (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

In meinem Fall, "Xyzzy" ist eigentlich eine verwaltete Eigenschaft nicht.  Wenn ich es SelectedProperties trotzdem hinzugefügt, SharePoint warf eine meiner Lieblings immer Laufzeitausnahmen:

"Der Schöpfer dieser Störung keinen Grund geben."

Besonders gut gefällt mir die Hauptstadt "R" in der Vernunft.  Das klingt für mich wie die.NET-Äquivalent des"I have no mouth, and I must scream.”

</Ende>

Onnieren Sie meinen Blog ab.

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

Praktisches Nachschlagewerk: Standard-Ergebnisse aus KeywordQuery Suche

Beim Aufrufen der Execute() eine KeywordQuery-Methode, Sie können eine ResultTable basierend auf ResultType.RelevantResults erstellen.  Dieser Codeausschnitt veranschaulicht, was ich meine:

ResultTableCollection ResultsTableCollection = myKeywordQuery.Execute();

ResultTable SearchResultsTable = ResultsTableCollection[ResultType.RelevantResults];

Die sich ergebende Tabelle müssen die folgenden Spalten mit Informationen: 

Arbeits-ID
Rang
Titel
Autor
Größe
Pfad
Beschreibung
Schreiben
SiteName
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Eine SharePoint Liste abgeleitet 2010 Umgebung, Enterprise-Edition.  Hoffentlich wird es praktisch, um jemand in Zukunft sein.

</Ende>

Onnieren Sie meinen Blog ab.

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

Ein Grund für: "Fehler beim Extrahieren der Cab-Datei in der Projektmappe”

Während der Arbeit an einem Webpart visual Studio Projekt heute, Ich habe eine kleine Rück-Org einige Dateien in den Ordner _layouts als Teil des Bereitstellungsprozesses umgesetzt werden. Speziell, Ich benannte eine JS-Datei von "TypeAhead.js" auf "TypeAhead(alte).Js"  Ich plane, es zu entfernen, sobald dessen Nachfolger "TypeAhead.js" richtigen beweist.  Es sah so aus:

image

Dies verursacht sofort ein Problem mit visual Studio, als ich versuchte, das Projekt bereitstellen:

Fehler bei der Bereitstellungsschritt 'Projektmappe hinzufügen': Fehler beim Extrahieren der Cab-Datei in der Projektmappe.

Es stellt sich heraus, dass Sie keine Klammer in Dateinamen einfügen sollten.  Ich entfernte die Pars und das Problem gelöst.

</Ende>

Onnieren Sie meinen Blog ab.

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