SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




SPView.Update innerhalb RunWithElevatedPrivileges-Block reagiert erst nach manuellem Pagerefresh

Unbeantwortet Dieser Beitrag hat 12 Antworten

Ohne Rang
32 Beiträge
LuckB erstellt 16 Dez. 2009 09:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich habe mir ein Webpart geschrieben, welches als eine Funktion anhand von einer ID mir Einträge aus einer verknüpften Tabelle filtert und anzeigt.

Nun hatte ich das Problem, dass Listview.Update bei Benutzern die nicht Admin waren nicht ausgeführt wurde.

Nun habe ich den entsprechenden Teil in einen SPSecurity.RunWithElevatedPrivileges Block eingelagert.

Das funktioniert "eigentlich" auch,

AUSSER dass die korrekte Aktualisierung nur nach erneutem Refresh der Seite ausgeführt wird.

Ausserhalb des "RunWithElevatedPrivileges" Block funktioniert der identische Code ohne zusätzlichen Refresh, sobald er sich innerhalb des RWEP Blocks befindet wird der Listview erst nach erneutem Refresh der Seite aktualisiert.

Kennt eventuell jemand ein derartiges Verhalten oder koennte mir Hinweise zur Fehlerfindung geben?

 

Vielen Dank schonmal.

Gruss

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Dez. 2009 09:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Irgend etwas muß wohl an Deinem Code faul sein. Was kann Dir niemand sagen, weil Du ihn nicht gepostet hast...

Hast Du alle SPSite und SPWeb-Instanzen auch innerhalb des RWEP neu erzeugt? Wenn Du nämlich die von außerhalb verwendest (z.B. aus SPContext.Current), dann bringt das nichts.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
32 Beiträge
LuckB Als Antwort am 16 Dez. 2009 10:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

danke für Deine Antwort.

Das mit dem Neu-Erzeugen ist mir bewusst. Ansonsten hätte ich ja auch weiterhin die Exception erhalten, dass der aktuelle Benutzer das nicht darf.

Was mir gerade noch aufgefallen ist,

wenn ich das "projekt" neu debugge mit codeänderungen hat er immernoch das zuletzt geöffnete Element in der Liste, obwohl der korrekte Filterwert angegeben ist.

In meinen Augen recht unlogisch da ja beim Veröffentlichen etc. ein iisreset durchgeführt wird? Oder liegt genau hier ein Problem vor, was mir aufgrund meiner Unwissenheit nicht wirklich ins Auge schiesst?

Hier der Code:

                        SPSecurity.RunWithElevatedPrivileges(delegate()
                        {
                            using (SPSite site = new SPSite(siteGuid))
                            {
                                using (SPWeb web = site.OpenWeb(webGuid))
                                {
                                web.AllowUnsafeUpdates = true;
                                SPList spPKEintraege = web.Lists[_zielListenName];
                                SPView viewTemp = spPKEintraege.Views[_zielView];
                                viewTemp.Query = "<Where>" +
                                                 "<Eq><FieldRef Name='" + zielListeSuchSpalte + "' /><Value Type='Lookup'>" + filterWert + "</Value></Eq>" +
                                                 "</Where>";
                                viewTemp.Update();

                                _lvAnzeige.ListId = spPKEintraege.ID.ToString();
                                _lvAnzeige.ViewId = viewTemp.ID.ToString();

                                Controls.Add(_lvAnzeige);
                                web.AllowUnsafeUpdates = false;
                                web.Update();
                                }
                            }
                        });

Das ist der betroffene CodeBlock. Die Site und WebGUID hole ich mir vorher über SPContext.Current.Web.ID /~Site.ID und speichere diese in den Variablen.

Ohne den RWEP Block funktioniert das Ganze "korrekt" für Admins ohne manuellen Siterefresh.

 

Gibt es hier im Forum eigentlich einen Tag zum Einfügen von Code?

Danke schonmal für Eure Hilfe.

 

Gruss

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Dez. 2009 10:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also der Code ist soweit korrekt. Ich habe nur schon oft gesehen, daß SPSite/SPWeb von außerhalb des RWEP einfach weiter verwendet wurden, daher der Hinweis.

Ich schätze, daß Du hier einem Caching-Problem aufgesessen bist. Du änderst ja die Ansicht für einen anderen Benutzer, zeigst die Liste aber für den aktuellen Benutzer an. Keine Ahnung, ob man da was machen kann, aber Du kannst ja Caching in den Webparteinstellungen abschalten. Vielleicht hilft es.

[quote user="LuckB"]Gibt es hier im Forum eigentlich einen Tag zum Einfügen von Code?[/quote]

Das habe ich auch noch nicht gefunden :-(

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
32 Beiträge
LuckB Als Antwort am 16 Dez. 2009 11:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

War ja ein berechtigter Hinweis.

Könntest Du mir evtl. noch verraten wo ich diese Option finde oder einen Hinweis geben? Habe gerade geschaut und auch gegoogelt aber irgendwie finde ich dabei direkt nichts.

Meinst Du per "Menü" oder als generelle Einstellung per Code für dieses Webpart?

 

Vielen Dank. Gruß

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Dez. 2009 12:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, ich habe gerade nachgesehen, aber bei den "normalen"-Listview-Webparts gibt es diese Einstellmöglichkeit nicht (wie bei Datenansichten). Keine Idee, wie man dem beikommen könnte...

An welcher Stelle im Page-Lifecycle hast Du das denn eingebaut?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
32 Beiträge
LuckB Als Antwort am 16 Dez. 2009 14:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das Ganze wird innerhalb einer Methode ausgeführt die in "protected override void CreateChildControls()"  des Webparts aufgerufen wird.

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Dez. 2009 14:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hast Du es schonmal (testweise) nach OnLoad oder gar OnInit verschoben?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
32 Beiträge
LuckB Als Antwort am 16 Dez. 2009 14:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich dachte bisher dass zwischen OnLoad noch die Conntection Consumer Methode aufgerufen wird und dann CreateChildControl().

Da das Webpart auf einer eingehenden Verbindung basiert, hat es diese zu dem "frühen" Zeitpunkt noch nicht.

Oder sehe ich da was falsch?

 

Habs gerade auch ausprobiert und das funktioniert leider nicht.

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Dez. 2009 17:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="LuckB"]Ich dachte bisher dass zwischen OnLoad noch die Conntection Consumer Methode aufgerufen wird und dann CreateChildControl().

Da das Webpart auf einer eingehenden Verbindung basiert, hat es diese zu dem "frühen" Zeitpunkt noch nicht.[/quote]

Da hast Du recht, aber das hattest Du bisher entweder nicht erwähnt oder ich habe es überlesen. Schade, aber da hätte ich dann nur noch die Idee, auf das ListView zu verzichten und stattdessen die Daten per SPQuery auszulesen und in einem SPGridView darzustellen. Das funktioniert dann sicher...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
32 Beiträge
LuckB Als Antwort am 16 Dez. 2009 18:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das hatte ich bisher leider wirklich nicht erwähnt.

Ok dann werde ich mich mal der ganzen Sache mit SPQuery & SPGridView annehmen und hoffe dass es damit klappt.

Falls es damit nicht klappt sollte ich mir wohl mal Gedanken machen. Ich melde mich dann wieder.

Nochmal vielen Dank für Deine Unterstützung.

 

Gruss

Ohne Rang
32 Beiträge
LuckB Als Antwort am 18 Dez. 2009 08:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

bin gestern nicht dazu gekommen.

Mit SPGridView funktioniert das Ganze nun.

Ich würde nur gerne verstehen warum es nicht mit Listview funktioniert. Nur weiss ich nicht wirklich was ich noch ausprobieren soll um herauszufinden warum. Entweder ist es ein generelles Problem oder ich übersehe etwas, da ich das Ganze mit GridView exakt gleich aufgebaut habe.

Nichtsdestotrotz vielen lieben Dank für Deine Unterstützung.

 

Gruss

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Dez. 2009 08:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich kann Dir das auch nicht genau sagen. Das ListView lädt seine Daten ja zu irgendeinem Zeitpunkt automatisch. Zu irgendeinem anderen Zeitpunkt hast Du die Datenquelle im Kontext eines anderen Users verändert und da scheint es Überschneidungen zu geben.

Mit dem SPGridView hast Du ja selbst alles unter Kontrolle und es läuft alles unter dem selben User.

Viele Grüße
Andi
af @ evocom de
Blog