Sonntag, 12. Februar 2012

Update Field mithilfe des Liste-Webservices



private static Lists InitListsService(string url, bool usedefaultCredentials) 
{
  Lists Lists = new Lists(); Lists.Url = url + "/_vti_bin/Lists.asmx";
  Lists.UseDefaultCredentials = usedefaultCredentials; 
  if (usedefaultCredentials) 
  {
    string user = ConfigurationSettings.AppSettings["user"]; 
    string passwd = ConfigurationSettings.AppSettings["passwd"]; 
    string domain =  ConfigurationSettings.AppSettings["domain"]; 
    Lists.Credentials = new System.Net.NetworkCredential(user, passwd, domain);
  } 
  return Lists;
}

XmlDocument xmlDoc = new System.Xml.XmlDocument();
XmlNode ndUpdateFields = xmlDoc.CreateNode(XmlNodeType.Element, "Fields", ""); StringBuilder methods = new StringBuilder(); methods.Append(""); methods.Append(");
methods.Append("ShowInDisplayForm='FALSE' "); methods.Append("Type='Number' "); methods.Append("Name='fieldname' "); methods.Append("DisplayName='internalname' "); 
methods.Append("Required='FALSE' "); methods.Append("FromBaseType='TRUE' "); methods.Append("Description=''/>"); methods.Append("");
ndUpdateFields.InnerXml = methods.ToString(); 
XmlNode xReturn = lists.UpdateList("ListName", null, null, ndUpdateFields, null, null);

Donnerstag, 2. Februar 2012

SPItemEventPropertiesBase.Cancel is deprecated

Nachdem ich Probleme mit der Anzeige der Cancel-Message beim Abbruch eines ItemUpdating Events hatte bin ich in der  MSDN  auf Folgendes gestoßen:
This is a deprecated property and should not be used. Instead, use the Status property to cancel an event. A truevalue is equivalent to setting Status to CancelWithError. A false value is equivalent to setting Status to Continue.

Mittwoch, 1. Februar 2012

SPSecurity.RunWithElevatedPrivileges vs. SPUserToken.SystemAccount

Die Verwendung von RunWithElevatedPrivileges  erzeugt komplexen Code der die einen oder anderen Probleme mitbringt. Auch erhält man dadurch SiteCollectionAdmin-Berechtigung auf allen SiteCollections der aktuellen WebApplication.
Einfacher und eleganter kommt man in den meisten Fällen mit dem SystemAccount Token zum Ziel, der sich nur auf eine SPSite bezieht.

Die Ausnahme:
Zum ermitteln des SystemAccount Tokens braucht der aktuelle User eine Berechtigung auf der entsprechenden SPSite. Ist dies nicht gegeben führt kein Weg an RunWithElevatedPrivileges vorbei.
Dabei sollte dann aber nur der SystemAccount Token ermittelt werden und dann der Bereich wieder verlassen werden. Da der UserToken lediglich ein ByteArray ist, kann man diesen  aus dem elevated-Block heraus zurückgeben, ohne sich über mögliche Referenzen Gedanken zu machen.

Laut Microsoft ist SPUserToken.SystemAccount  einem site.SystemAccount vorzuziehen.
Möchte man allerdings die AccessDeniedException selbst behandeln um z.B mit RunWithElevatedPrivileges darauf zu reagieren, kann man eine SPSite-Instanz verwenden, .CatchAccessDeniedException = false setzen und im catch Block entsprechend reagieren.

Eine schöne Lösung die mit einer Extension-Method umgesetzt hat Keith Dahlby zur Verfügung gestellt.


ListViewWebPart 2010 naechster Versuch

Dank Mohamed M Malek und Bryan Napier hab auch ich jetzt endlich verstanden was beim hinzufügen eines ListViewWebParts passiert. Der Schlüssel ist die versteckte View die durch den LimitedWebPartManger in der zugehörigen Liste angelegt wird und durch einen list.Update() persistiert werden muss.

Das erklärt auch die Probleme die ich nach dem Hinzufügen eines WebParts hatte, die allerdings nur solange bestanden, bis der Edit-Dialog des WebParts aufgerufen wurde und mit [OK] wieder geschlossen wurde.
Zum einen fehlte im WebPart der "Add New Atem"-Link und zum anderen wurde ein Feld das auf einem Custom Fieldtype basiert, nicht richtig gerändert.

Möchte man die View anpassen muss man das WebPart zum LimitedWebPartManager hinzufügen die Liste Updaten und sich danach das Listen- und das Webart-Object neu erzeugen.
Das View-Objekt erhält man in dem man mit der Webart.ViewGuid die versteckte View aus der Liste holt. Dieses Object kann dann beliebig verändert werden.


Mohamed Malek zeigt darüberhinaus wie das die Toolbox der WebParts verändert werden kann.