Αρχεία κατηγοριών: Ανάπτυξη του SharePoint

HTTP 406 Σφάλμα κατά τη χρήση γωνιακή $http.get εναντίον του SharePoint υπόλοιπο τελικά σημεία

Ενημέρωση: Marc AD ndersson επεσήμανε αυτό το μεγάλο κομμάτι των πληροφοριών: http://Blogs.Office.com/2014/08/13/JSON-Light-support-REST-SharePoint-API-Released/. Που εξηγεί πολύ :).

Αυτό μπορεί να είναι η χειρότερη τίτλος του ένα blog post ποτέ! Anyhoo.

Συνήθως κάνω όλα μου πρωτοτυποποίηση ενάντια σε μια παρουσία O365. Έχω προσωπική παράδειγμα μου, έτσι ώστε δεν χρειάζεται να ανησυχείτε για το που κάποιος άλλος επηρεάζουν. Σαν παραλειπόμενα-Θυμηθείτε όταν καλούμε γίνεται γύρω από τις εικονικές μηχανές μας φορητούς υπολογιστές με το ΒΡΎΟ-SQL Server, IIS, ΑΡΧΈΣ vs Hyper-V. VMWare? Anyhoo...

Είχα αναπτύξει app χρησιμοποιώντας γωνιακή σε αυτό το περιβάλλον που κάνει, μεταξύ άλλων, αυτό:

$http.get(serverUrl)
.επιτυχία(συνάρτηση(δεδομένα, κατάσταση, κεφαλίδες, Config) {

var getLinksResponse = δεδομένων;

getLinksResponse.value.forEach(συνάρτηση(theResult) {

// και ούτω καθεξής και έτσι αφρό

Δούλευε μια χαρά σε δύο διαφορετικά SharePoint online περιβάλλοντα. Ωστόσο, όταν ο συνάδελφός μου μεταφέρει σε μια παρουσία Cloudshare, είχε πάρει μια HTTP 406 σφάλμα (που ήταν η πρώτη φορά που πήρα ποτέ ότι ένας, έτσι... yay, Υποθέτω). Κάναμε ένα κομμάτι της έρευνας και παρατήρησα ότι η επικεφαλίδα "Αποδοχή" ήταν μακριά. SharePoint online ήταν απόλυτα ευχαριστημένος με:

Δεχθεί: εφαρμογή/json

Αλλά η παρουσία του cloudshare (Ποιο είναι το SP στο prem, φιλοξενείται σε έναν εικονικό διακομιστή) ήθελε το κλασικό "odata = verbose" προστίθεται στο καθώς και:

Δεχθεί: εφαρμογή/json;OData = λεπτομερή

Να καθορίσει ότι, Έχουμε προσθέσει την κεφαλίδα, ως εκ τούτου:

var config = {κεφαλίδες: {
"Αποδοχή": «εφαρμογή/json;OData = λεπτομερή»
}
};

$http.get(serverUrl,Config)
.επιτυχία(συνάρτηση(δεδομένα, κατάσταση, κεφαλίδες, Config) {

var getLinksResponse = δεδομένων;

getLinksResponse.value.forEach(συνάρτηση(theResult) {

// και ούτω καθεξής και έτσι αφρό

Που πια απαλλαγεί από το 406, αλλά επίσης άλλαξε την μορφή της απάντησης. Ήταν περισσότερο... λεπτομερούς καταγραφής. (haha!) Περισσότερες αλλαγές που απαιτούνταν, και εδώ είναι το τελικό αποτέλεσμα:

var config = {κεφαλίδες: {
"Αποδοχή": «εφαρμογή/json;OData = λεπτομερή»
}
};

$http.get(serverUrl,Config)
.επιτυχία(συνάρτηση(δεδομένα, κατάσταση, κεφαλίδες, Config) {

var getLinksResponse = δεδομένων;

getLinksResponse.d.Results.forEach(συνάρτηση(theResult) {

// και ούτω καθεξής και έτσι αφρό

Αυτό μόνο να μετατραπεί σε ένα 30 λεπτό πρόβλημα για μας, έτσι εμείς lucked έξω. Ας ελπίσουμε ότι κάποιος βρίσκει χρήσιμες.

</Τέλος>

Αυξανόµενη / Έγκριση JavaScript πλαισίων

Ο συνάδελφός μου, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), έγραψε μια σύντομη περίληψη του blog για τα πλαίσια του αρέσει ή τουλάχιστον έχει χρησιμοποιήσει με με SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery φαίνεται να είναι ο νικητής στο πεδίο, να το πω έτσι, για χρόνια τώρα, αλλά οι άλλοι είναι πιο νέα και αποστακτήρες είδος μάχεται, όπως γωνιακή. (SPServices, Φυσικά, έχει μια ζωή saver για χρόνια και θα συνεχίσει να είναι έτσι νομίζω).

Τι οι άνθρωποι που χρησιμοποιούν? Εστιάζουν περισσότερο στην εργαλειακή της Microsoft (CSOM / JSOM) ή κινείται περισσότερο προς τη γωνιακή, Νοκ-άουτ, Χόβολη, κλπ?

Έχω μια αυξανόμενη τάση προς την κατεύθυνση αυτών των μη-Microsoft πλαισίων. Νομίζω ότι τα πράγματα MSFT είναι ολοένα και δυσκολότερο να συνεργαστεί με, που απαιτούν σχεδόν τόσο πολύ από την καμπύλη εκμάθησης με ανισοϋψείς διακομιστή dev.

Ταχυδρομήστε ένα σχόλιο εδώ ή πάνω σε Μεγάλο μήλο SharePoint Αν θέλετε να συζητήσετε (Μεγάλο μήλο θα έχουν μεγαλύτερη πιθανότητα να μια καλή συζήτηση).

</Τέλος>

Γυρίζοντας εργασίες χρονομέτρησης SharePoint από συλλογή Διαμόρφωση ιστοτόπου

Ο συνάδελφός μου, Ashish Patel, έγραψα μια θέση blog Περιγράφοντας ένα ευέλικτο χρονόμετρο αρχιτεκτονική εργασία που αντέχει οικονομικά κάποια ωραία ευελιξία για την υποστήριξη των εργασιών ή/και εκθέσεων μακράς διαρκείας.  Σύμφωνα με τα λόγια:

1. Ανάλυση ντούκου, τα αρχεία και να στέλνει υπενθυμίσεις για τα άτομα, αν ο αριθμός των ημερών (Δεδομένου ότι ήταν αποδεσμευμένο το αρχείο) υπερβαίνει ορισμένα όρια κατώτατων ορίων

2. Κατάργηση των δεσμών από άλλο περιεχόμενο όταν ένα συγκεκριμένο περιεχόμενο is απομάκρυνα ή αρχειοθετούνται από το σύστημα

3. Χρήστης θέλει να δείτε όλες τις προειδοποιήσεις που αυτός εγγραφεί σε όλους τους ιστούς της συλλογής τοποθεσιών

4. Στέλνει ένα υπενθυμίσεις σε συγγραφείς να επανεξετάσει το περιεχόμενο, όταν μια φορά αναθεώρηση καθορίστηκε στο περιεχόμενο και ότι η ημερομηνία ληξεως πλησιάζει

Καλά, ο κατάλογος συνεχίζεται...

– Δείτε περισσότερα στο: http://www.bigapplesharepoint.com/ σελίδες/θέα-An-Insight.aspx?BlogID=40#sthash.7cKuiwly.dpuf

Υπάρχουν φορές στο παρελθόν μου όταν έχοντας κάτι τέτοιο θα ήταν πολύ χρήσιμο.

</Τέλος>

Πώς να: Ρυθμίσετε τη δοκιμασία της ενότητας και δοκιμή κάλυψης με QUnit.js και Blanket.js για ένα γραφείο 365 SharePoint App

Εισαγωγή

Εγώ εξερεύνηση δοκιμών μονάδας και δοκιμή κάλυψη για JavaScript, όπως το έργο σε μια νέα εφαρμογή SharePoint για το SharePoint online στο γραφείο 365 Σουίτα.  Τα μονοπάτια προφανές έρευνα με οδήγησε να Qunit.js και αμέσως μετά, να BLANKET.js.

QUnit θέλω να δημιουργήσει μονάδα δοκιμές και να τους ομαδοποιήσουν σε ενότητες.  Μια ενότητα είναι ένας απλός τρόπος για να οργανώσει τις σχετικές δοκιμές. (Δεν είμαι σίγουρος ότι είμαι το χρησιμοποιεί ως θελήσει, αλλά λειτουργεί για μένα μέχρι στιγμής με το μικρό σύνολο των δοκιμών που έχω μέχρι στιγμής ορίζεται).

BLANKET.js ενσωματώνει με Qunit και θα μου δείξει το πραγματικό γραμμές της JavaScript που ήταν- και πιο σημαντικό-δεν πραγματικά εκτελέστηκαν κατά τη διάρκεια εκτέλεσης των δοκιμών.  Αυτό είναι "κάλυψη"-γραμμές που εκτελούνται καλύπτονται από τη δοκιμή, ενώ άλλοι δεν είναι.

Μεταξύ τη δημιουργία καλές περιπτώσεις δοκιμής και της προβολής κάλυψη, μπορούμε να μειώσουμε τον κίνδυνο ότι μας κώδικα έχει παρουσιάσει ένα κρυμμένο ελάττωμα.  Καλές εποχές.

Qunit

Υποθέτοντας ότι έχετε το Visual Studio σας έργο, το οποίο έχει συσταθεί, έναρξη με τη μεταφόρτωση του πακέτου JavaScript από http://qunitjs.com.  Προσθέστε το JavaScript και CSS αντίστοιχη λύση σας.  Ορυχείο μοιάζει με αυτό:

image

Σχήμα 1

Όπως μπορείτε να δείτε, Ήμουν χρησιμοποιώντας 1.13.0 τη στιγμή που έγραψα αυτό το blog post. Μην ξεχάσετε να κατεβάσετε και να προσθέσετε το αρχείο CSS.

Που έξω από το δρόμο, επόμενο βήμα είναι να δημιουργήσουμε κάποιο είδος της δοκιμής καλωδίων και αναφοράς τα Qunit κομμάτια.  Εγώ δοκιμή μια δέσμη των λειτουργιών σε ένα αρχείο δέσμης ενεργειών που ονομάζεται "QuizUtil.js" έτσι δημιούργησα μια σελίδα HTML που ονομάζεται "QuizUtil_test.html", όπως φαίνεται:

image Σχήμα 2

Εδώ είναι ο κώδικας:

<!DOCTYPE HTML>
<HTML xmlns= "http://www.w3.org/ 1999/xhtml">
<κεφάλι>
    <Τίτλος>QuizUtil δοκιμή με Qunit</Τίτλος>
    <σύνδεση rel= "φύλλο στυλ" href="../CSS/qunit-1.13.0.CSS" />
    <σενάριο Τύπος= text/javascript"" src="QuizUtil.js" δεδομένα-κάλυψη></σενάριο>
    <σενάριο τύπου ="text/javascript" src ="qunit-1.13.0.js"></σενάριο>
    <σενάριο τύπου ="text/javascript" src ="blanket.min.js"></σενάριο>

    <σενάριο>
        ενότητα("getIDFromLookup");
        δοκιμή("QuizUtil getIDFromLookupField", συνάρτηση () {
            var goodValue = "1;#Paul Galvin";

            ίση(getIDFromLookupField(goodValue) + 1, 2), "Το ID του [" + goodValue + "] + 1 θα πρέπει να είναι 2";
            ίση(getIDFromLookupField(απροσδιόριστο), απροσδιόριστο, «Απροσδιόριστη όρισμα εισόδου θα πρέπει να επιστρέψει απροσδιόριστο αποτέλεσμα.");
            ίση(getIDFromLookupField(""), απροσδιόριστο, "Κενό όρισμα εισόδου θα πρέπει να επιστρέψει μια τιμή που δεν έχει οριστεί.");
            ίση(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;VN"), απροσδιόριστο,"Πρέπει να επιστρέφει πάντα ένα μετατρέψιμο αποτέλεσμα σε ακέραιο");
            ίση(getIDFromLookupField("2;#κάποιου άλλου προσώπου"), "2", "Έλεγχος [2;#κάποιου άλλου προσώπου].");
            ίση(getIDFromLookupField("9834524;#τιμή Long"), "9834524", "Μεγάλη αξία δοκιμής.");
            notEqual(getIDFromLookupField("5;#κάποιος", 6), 6, "Δοκιμή ένα notEqual (5 δεν είναι ίσο με 6 για αυτό το δείγμα: [5;#κάποιος]");

        });

        ενότητα("htmlEscape");
        δοκιμή("QuizUtil htmlEscape()", συνάρτηση () {
            ίση(htmlEscape("<"), "&lt;", "Δραπετεύοντας από μια λιγότερο από το χειριστή ('<')");
            ίση(htmlEscape("<div τάξη =  "someclass">Κάποιο κείμενο</div>"), "&lt;div τάξη =&quot;someclass&quot;&gt;Κάποιο κείμενο&lt;/div&gt;", «Πιο περίπλοκη συμβολοσειρά δοκιμή.");
        });

        ενότητα("getDateAsCaml");
        δοκιμή("QuizUtil getDateAsCaml()", συνάρτηση () {
            ίση(getDateAsCaml(νέα Ημερομηνία("12/31/2013")), «2013-12-31T:00:00:00", «Δοκιμαστεί σκληρά κωδικοποιημένο ημερομηνία: [12/31/2013]");
            ίση(getDateAsCaml(νέα Ημερομηνία("01/05/2014")), "2014-01-05T:00:00:00", «Δοκιμαστεί σκληρά κωδικοποιημένο ημερομηνία: [01/05/2014]");
            ίση(getDateAsCaml(νέα Ημερομηνία("01/31/2014")), "2014-01-31T:00:00:00", «Δοκιμαστεί σκληρά κωδικοποιημένο ημερομηνία: [01/31/2014]");
            ίση(getTodayAsCaml(), getDateAsCaml(νέα Ημερομηνία()), "getTodayAsCaml() θα πρέπει να ισούται με getDateAsCaml(νέα ημερομηνία())");
            ίση(getDateAsCaml(«ανοησίες αξία"), απροσδιόριστο, "Προσπαθήστε να πάρετε την ημερομηνία αξίας ανοησίες.");
            ίση(getDateAsCaml(απροσδιόριστο), απροσδιόριστο, "Προσπαθήστε να πάρετε την ημερομηνία της [απροσδιόριστο] ημερομηνία.");
        });

        ενότητα("getParameterByName");
        δοκιμή("QuizUtil getParameterByName (από τη συμβολοσειρά ερωτήματος)", συνάρτηση () {
            ίση(getParameterByName(απροσδιόριστο), απροσδιόριστο, "Προσπαθήστε να πάρετε απροσδιόριστη παράμετρος θα πρέπει να επιστρέψει απροσδιόριστη.");
            ίση(getParameterByName("δεν υπάρχει"), απροσδιόριστο, "Προσπαθήστε να πάρετε τιμή παραμέτρου, όταν γνωρίζουμε ότι δεν υπάρχει η παράμετρος.");

        });

        ενότητα("Cookies");
        δοκιμή("QuizUtil διάφορες λειτουργίες του cookie.", συνάρτηση () {
            ίση(setCookie("δοκιμή", "1", -1), getCookieValue("δοκιμή"), "Πάρτε ένα cookie που έθεσα πρέπει να λειτουργήσει.");
            ίση(setCookie("anycookie", "1", -1), TRUE, "Ρύθμιση ένα έγκυρο ψήσιμο πρέπει να επιστρέψει «αληθινή».");
            ίση(setCookie("το όνομα του cookie τρελό !@#$%"%\^&*(()?/><.,", "1", -1), TRUE, "Ρύθμιση ένα όνομα κακή cookie θα πρέπει να επιστρέψει 'false'.");
            ίση(setCookie(απροσδιόριστο, "1", -1), απροσδιόριστο, «Περνώντας αόριστη ως το όνομα του cookie.");
            ίση(getCookieValue("δεν υπάρχει"), "", "Cookie δεν υπάρχει τεστ.");
        });

    </σενάριο>
</κεφάλι>
<οργανισμός>
    <div αναγνωριστικό= "qunit"></div>
    <div αναγνωριστικό= "qunit-φωτιστικό"></div>

</οργανισμός>
</HTML>

Υπάρχουν διάφορα πράγματα που συμβαίνουν εδώ:

  1. Παραπομπή κωδικός (QuizUtil.js)
  2. Αναφορά Qunity.js
  3. Ακρίβεια ορισμένων μονάδων (getIDFromLookup, Τα cookies, και άλλοι)
  4. Τοποθέτηση ένα <div> του οποίου η ταυτότητα είναι "qunit".

Στη συνέχεια, Μόλις σηκώσετε αυτή τη σελίδα και μπορείτε να πάρετε κάτι σαν αυτό:

image

Σχήμα 3

Αν κοιτάξετε πέρα από την κορυφή, έχετε μερικές επιλογές, δύο από τα οποία είναι ενδιαφέροντα:

  • Απόκρυψη περάσει δοκιμές: Αρκετά προφανές.  Μπορεί να βοηθήσει το μάτι σας δείτε απλά τις προβληματικές και δεν έχει πολλή ακαταστασία.
  • Ενότητα: (αναπτυσσόμενο): Αυτό θα φιλτράρετε τις δοκιμές κάτω ακριβώς από αυτές τις ομάδες των δοκιμών που θέλετε.

Όσο για τις δοκιμές τους – μερικά σχόλια:

  • Είναι αυτονόητο ότι θα πρέπει να γράψετε τον κωδικό σας ώστε να είναι ελέγξιμο στην πρώτη θέση.  Χρησιμοποιώντας το εργαλείο μπορεί να βοηθήσει να επιβάλει την πειθαρχία που. Για παράδειγμα, Είχα μια λειτουργία που ονομάζεται "getTodayAsCaml()”.  Αυτό δεν είναι πολύ δοκιμάσιμος δεδομένου ότι παίρνει κανένα όρισμα εισόδου και να το δοκιμάσετε για την ισότητα, θα πρέπει να συνεχώς να ενημερώσετε τον κωδικό του τεστ να αντικατοπτρίζουν την τρέχουσα ημερομηνία.  Εγώ το αλλαγμένος από προσθέτοντας μια παράμετρο εισόδου δεδομένων, στη συνέχεια, περνώντας την τρέχουσα ημερομηνία όταν θέλω σήμερα σε μορφή CAML.
  • Το πλαίσιο Qunit τεκμηριώνει τις δικές της δοκιμές και φαίνεται αρκετά ισχυρή.  Αυτό μπορεί να κάνει τα απλά πράγματα όπως τη δοκιμή για την ισότητα και έχει επίσης την υποστήριξη για ajax κλήσεις ύφους (τόσο «πραγματική» ή εμπαίζονται χρησιμοποιώντας σας αγαπημένο στασιαστικά·).
  • Περάσει από τη διαδικασία και τις δυνάμεις σας για να σκέφτονται μέσα από περιπτώσεις ακρών-τι θα συμβεί με το "απροσδιόριστο" ή null είναι πέρασε σε μια λειτουργία.  Καθιστά νεκρός απλό να ελέγξετε αυτά τα σενάρια έξω.  Καλά πράγματα.

Κάλυψη με Blanket.js

BLANKET.js συμπληρώνει Qunit παρακολουθώντας τις πραγματικές γραμμές κώδικα που εκτελούνται κατά τη διάρκεια του τρεξίματος σας δοκιμές.  Ενσωματώνει δικαίωμα στο Qunit ώστε ακόμα κι αν είναι ένα ολόκληρο ξεχωριστό app, παίζει ωραία-φαίνεται πραγματικά σαν να είναι ένα άνευ ραφής app.

Αυτό είναι blanket.js σε δράση:

image Σχήμα 4

image

Σχήμα 5

(Στην πραγματικότητα, έχετε να κάνετε κλικ για το κουτάκι "Ενεργοποίηση κάλυψη" στην κορυφή [βλέπε σχήμα 3] για να επιτρέψετε αυτό.)

Γραμμές που επισημαίνονται στο σχήμα 5 δεν έχουν εκτελεστεί από οποιαδήποτε από τις δοκιμές μου, έτσι πρέπει να επινοήσουν μια δοκιμή που να τους αναγκάσει να εκτελέσει αν θέλω πλήρη κάλυψη.

Πάρετε blanket.js εργασίας ακολουθώντας τα παρακάτω βήματα:

  1. Κατεβάσετε από http://blanketjs.org/.
  2. Προσθέστε στο έργο σας
  3. Ενημέρωση σας λουρί δοκιμαστική σελίδα (QuizUtil_test.html στη δική μου περίπτωση) ως εξής:
    1. Ο κωδικός αναφοράς
    2. Διακοσμήσετε σας <σενάριο> αναφοράς, όπως αυτό:
    <σενάριο Τύπος= text/javascript"" src="QuizUtil.js" δεδομένα-κάλυψη></σενάριο>

BLANKET.js παίρνει το χαρακτηριστικό "δεδομένα-κάλυψη" και κάνει τη μαγεία.  Αυτό να γάντζους σε Qunit, ενημερώνει το UI για να προσθέσετε την επιλογή "Ενεργοποίηση κάλυψη" και voila!

Περίληψη (TL; DR)

Χρήση Qunit να γραφτούν περιπτώσεις σας.

  • Το κατεβάσετε
  • Προσθέστε στο έργο σας
  • Γράψτε μια δοκιμαστική σελίδα λουρί
  • Δημιουργήστε τις δοκιμές σας
    • Μερικά του κώδικά σας να δοκιμάσιμος Refactor
    • Να είστε δημιουργικός!  Σκεφτείτε τρελό, αδύνατο σενάρια και δοκιμή τους ούτως ή άλλως.

Χρήση blanket.js για να εξασφαλισθεί η κάλυψη

  • Βεβαιωθείτε ότι εργάζεται Qunit
  • Λήψη blanket.js και να το προσθέσετε στο έργο σας
  • Προσθέσετε στη σελίδα δοκιμής καλωδίων:
    • Προσθέστε μια αναφορά για το blanket.js
    • Προσθέστε ένα χαρακτηριστικό "δεδομένα-κάλυψη" να σας <σενάριο> ετικέτα
  • Εκτελέστε τις δοκιμές σας Qunit.

Ποτέ δεν έκανα κανένα από αυτό πριν και είχε κάποια στοιχειώδη πράγματα που εργάζονται σε μια χούφτα ώρες. 

Καλή δοκιμή!

</Τέλος>

undefinedΕγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin

Lists.asmx, GetList και "τιμή δεν είναι δυνατό να είναι null”

Ανακάλυψα σήμερα που το GetList() μέθοδο σε lists.asmx υπηρεσία Web πρέπει να αποκαλείται πολύ προσεκτικά ή είναι επιρρεπείς να ρίξει ένα μυστηριώδες εξαίρεση "Αξία δεν μπορεί να είναι null" (και αυτό υποθέτοντας ότι μπορείτε να λάβετε παρελθόν το ακόμη χειρότερο μήνυμα γενικού σφάλματος, "Εξαίρεση του τύπου «Microsoft.SharePoint.SoapServer.SoapServerException’ δημιουργήθηκε.")  Ειδικά, Βρήκα ότι δεν μπορείτε να δώσετε οποιοδήποτε είδος πρόθεμα σχετικά με τη μέθοδο GetList.  Το ακόλουθο απόσπασμα jQuery διαφωτίζει το σημείο:

image

Αν το κάνετε που, η υπηρεσία web ανταποκρίνεται με "Αξία δεν μπορεί να είναι null" σύμφωνα με αυτό fiddler-παρείχε την απομαγνητοφώνηση HTTP:

<?XML έκδοση = 1.0»" κωδικοποίηση = "utf-8"?>
  <σαπούνι:Φάκελος
     xmlns:σαπούνι ="
http://schemas.xmlsoap.org/SOAP/Envelope/"    
     xmlns:xsi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:xsd ="
http://www.w3.org/ 2001/σχήματος XML">

  <σαπούνι:Οργανισμός>
    <σαπούνι:Σφάλμα>
      <faultcode>σαπούνι:Διακομιστή</faultcode>
      <faultstring>
        Εξαίρεση του τύπου «Microsoft.SharePoint.SoapServer.SoapServerException’ ρίχτηκε.
      </faultstring>
      <λεπτομέρεια>
        <errorstring xmlns ="
http://schemas.microsoft.com/SharePoint/SOAP/">
Αξία δεν μπορεί να είναι null.
        </errorstring>
      </λεπτομέρεια>
    </σαπούνι:Σφάλμα>
  </σαπούνι:Οργανισμός>
</σαπούνι:Φάκελος>

Φυσικά, πιθανώς δεν θα προσθέτετε πρόθεμα "s0" για τη δική σας, αλλά μερικά εργαλεία είναι επιρρεπείς να κάνουμε (όπως το Eclipse).

Αυτό είναι όλο και πιο συγκεχυμένη / απογοητευτικό επειδή άλλες μεθόδους ανέχεται προθέματα.  Για παράδειγμα, το GetListCollection μέθοδος δεν πειράζει εάν είναι γαλλική, ακόμη και με ανοησίες προθέματα όπως "xyzzy":

image

Αυτό "η τιμή δεν μπορεί να είναι null" φαίνεται αρκετά κοινά με lists.asmx, οπότε ελπίζω αυτό θα βοηθήσει κάποιος στο μέλλον.

</Τέλος>

Εγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin

Ένθεση ατελείωτα <div> Ετικέτες και jQuery

Αυτό φαίνεται σαν τέτοια ένα αιφνίδιο τέλος θέμα, Δεν είμαι σίγουρος ότι αξίζει πραγματικά blogging σχετικά με, αλλά αυτό ποτέ δεν έχει διακοπεί μου πριν από, Επομένως εδώ θα προχωρήσουμε Χαμόγελο

Εργάζομαι σε ένα έργο, όπου εγώ τράβηγμα ορισμένα δεδομένα από μια αναζήτηση, συσκευασίας αυτό σε ένα μήνυμα XML και στη συνέχεια το XML είναι τελικά μετατραπεί σε HTML μέσω XSLT.  Υπάρχει πολλή jQuery συμμετέχουν, ένα bit που υλοποιεί ορισμένα στηλοθέτησης λειτουργικότητα.  Όταν κάνετε κλικ σε μια καρτέλα (Αλήθεια, ένα <div>), jQuery επικαλείται .hide() και .show() στις διάφορες divs (το φορτίο Αρχική σελίδα λήψεις όλο το περιεχόμενο, ώστε να υπάρχουν σε αυτή την περίπτωση δεν καταχωρήσεων προς τα πίσω).

Ένα σωρό ώρες ago, το tab switching λογική άρχισε να συμπεριφερθούν με αστάθεια και δεν θα εμφανίζει μία μου καρτελών.  Τελικά παρακολούθησα αυτό οφείλεται φυσικά στο γεγονός ότι του internet explorer (τουλάχιστον) πίστευαν ότι το <div> ετικέτες που είναι ένθετες πολύ, πολύ βαθύτερα από τα οποία προορίζονται.Θα εμφανίσει τη γραμμή εργαλείων του δημιουργού:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— Τέλος, δείχνει αυτό έκλεισε τελείως εδώ!

Έτσι, Αν έκανα μια $(«#Tab1Content»).απόκρυψη(), Εγώ θα επίσης απόκρυψη Tab2 και εγώ θα μπορούσε ποτέ εμφάνιση Tab2 εάν εγώ δεν δείχνουν επίσης Tab1.  Αντέγραψα και επικόλλησα κώδικα σε visual studio και αυτό έδειξε όλα του div η επένδυση μέχρι ωραία, ακριβώς όπως υποτίθεται ότι κάνει, ψάχνει σαν αυτό:

-<div id = "Tab1Content">
  +<div>
  +<div>
-<div id = "Tab2Content">
  +<div>
  +<div>

Θα χτυπήσει το κεφάλι μου στον τοίχο για λίγο και παρατήρησα ότι στην πραγματική HTML κώδικα παράγει πολλά κενά <div> Ετικέτες, όπως:

<οργανισμός>

  <div id = "Tab1Content">

    <div αναγνωριστικό = «row1» />
    <div αναγνωριστικό = «row2» />

  </div>

  <div id = "Tab2Content">

    <div αναγνωριστικό = «row1» />
    <div αναγνωριστικό = «row2» />

  </div>

</οργανισμός>

(Τα παραπάνω είναι waaaaaaaaaaaay να μετατρέπονται σε κοινότοπα.  Τα κενά tag div tag είναι απολύτως έγκυρες. Ορισμένες μου <div> Ετικέτες ήταν πλήρες του περιεχόμενο, αλλά δεν ήταν πολλά περισσότερα.  Μου ήρθε με την υλοποίηση που μου <XSL:για-κάθε> οδηγίες εκπέμπουν τη συνοπτική div ετικέτες όταν το xsl:δεν for-each' βρει οποιαδήποτε δεδομένα.  Εγώ αναγκάζονται ένα σχόλιο HTML της εξόδου, όπως φαίνεται:

image

 

Αφού το έκανα που, όλα τα του div ευθυγραμμισμένο ωραία και μου καρτέλα εναλλαγής άρχισε να εργάζεται.

Όπως πάντα, Ελπίζω αυτό βοηθά κάποιον σε μια πρέζα.

</Τέλος>

Εγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin

Μια αιτία για "Ο δημιουργός αυτού του σφάλματος δεν καθόρισε μια αιτία.”

Έχω έχετε κάνει πολλή δουλειά με αναζήτησης SharePoint πρόσφατα και συγκεκριμένα την κλάση KeywordQuery, ιδιότητες και μέθοδοι.

Εάν θέλετε το αποτέλεσμα να επιστρέψει αποτελέσματα πέρα από τις συνήθεις υπόπτους (βλέπε εδώ), προσθέτετε τη συλλογή SelectedProperties, όπως και στην:

myKeywordQuery.SelectProperties.Add("xyzzy");

Ευχαριστώ πολύ και μια συμβουλή για το καπέλο να Corey Roth και Αυτό το εξαιρετικά χρήσιμο blog post (http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2008/02/19/how-to-use-the-moss-enterprise-search-keywordquery-class.aspx)

Στην περίπτωσή μου, "xyzzy" δεν είναι στην πραγματικότητα μια διαχειριζόμενη ιδιότητα.  Όταν προσθέσατε το SelectedProperties ούτως ή άλλως, SharePoint δημιούργησε ένα από τα αγαπημένα μου ποτέ runtime εξαιρέσεις:

"Ο δημιουργός αυτού του σφάλματος δεν καθόρισε μια αιτία."

Ήθελα κυρίως το κεφάλαιο "R" στο λόγο.  Αυτό ακούγεται μου ως ισοδύναμο με .net"Δεν έχω καμία στόμα, και εγώ πρέπει να ουρλιάζουν.”

</Τέλος>

Εγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin

Εύχρηστο αναφοράς: Προεπιλεγμένη αποτελέσματα αναζήτησης KeywordQuery

Όταν επικαλείστε το Execute() μέθοδος σε μια KeywordQuery, Μπορείτε να δημιουργήσετε ένα ResultTable που βασίζονται σε ResultType.RelevantResults.  Αυτό το τμήμα κώδικα δείχνει τι εννοώ:

ResultTableCollection resultsTableCollection = myKeywordQuery.Execute();

ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults];

Ο πίνακας που προκύπτει θα έχει τις ακόλουθες στήλες πληροφοριών: 

Αναγνωριστικό εργασίας
Κατάταξη
Τίτλος
Συγγραφέας
Μέγεθος
Διαδρομή
Περιγραφή
Γράψτε
Όνομα_τοποθεσίας
CollapsingStatus
HitHighlightedSummary
HitHighlightedProperties
ContentClass
IsDocument
PictureThumbnailURL
ServerRedirectedURL

Εγώ αυτόν τον κατάλογο που προέρχονται από ένα SharePoint 2010 περιβάλλον, επιχείρηση έκδοση.  Ας ελπίσουμε ότι θα είναι χρήσιμο σε κάποιον στο μέλλον.

</Τέλος>

Εγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin

Ένας λόγος για: "Απέτυχε να εξαγάγετε το αρχείο cab στο διάλυμα”

Ενώ εργάζεστε σε ένα τμήμα web visual studio έργου σήμερα, Έκανα ένα μικρό re-org ορισμένων αρχείων θα τεθούν σε φάκελο _layouts ως μέρος της διαδικασίας ανάπτυξης. Ειδικά, Εγώ μετονομάστηκε σε ένα αρχείο .js από "TypeAhead.js" "TypeAhead(παλιά).js"  Σκοπεύετε να το καταργήσετε, μόλις ο διάδοχός του "TypeAhead.js" είναι σωστή.  Φαινόταν ότι αυτό:

image

Αυτό προκάλεσε αμέσως ένα πρόβλημα με το visual studio, όταν προσπάθησα να αναπτύξετε το έργο:

Παρουσιάστηκε σφάλμα στο βήμα ανάπτυξης «Προσθέστε λύση»: Απέτυχε να εξαγάγετε το αρχείο cab στο διάλυμα.

Αποδεικνύεται ότι δεν πρέπει να θέσετε μια παρένθεση στα ονόματα αρχείων.  Κατάργησα την parens και που έλυσε το πρόβλημα.

</Τέλος>

Εγγραφείτε στο blog μου.

Συνέχεια μου για Twitter σε http://www.twitter.com/pagalvin