SharePoint 4 Developers

Guia de referência adicional em desenvolvimento .NET / SharePoint

SocialCommentControl - html5 bug

Este post mostra o fix para fazer o controle SocialCommentControl funcionar com Html5. No SP2013 este controle foi descontinuado (deprecated), o que explica o porquê de nada ter sido feito ao controle. Veja como corrigir o bug.

Oi pessoal,

Bom estar de volta falando sobre minhas experiências com SharePoint 2013. Já faz um tempinho desde meu último post, dessa vez estou postando sobre um fix para fazer o controle SocialCommentControl funcionar com Html5.

No SP2013 este controle foi descontinuado (deprecated), o que explica o porquê de nada ter sido feito ao controle. Ao adicioná-lo a uma page layout o markup quebra.

Nesse post estou falando desse controle, mas se você está usando SocialCommentWebpart o comportamento é o mesmo, pois ele empacota o controle com propriedades da webpart.

Googling não ajudou muito, então decidi fazer engenharia reversa dos assemblies SharePoint e ver a implementação. O problema está na html div tag. Com Html 5 self-closing tags não funcionam, e esse controle utiliza esse tipo de implementação, veja abaixo:

  1. protected override void CreateChildControls()
  2. {
  3.     base.CreateChildControls();
  4.     if (!this.IsUPAEnabled)
  5.     {
  6.         string text = SPHttpUtility.HtmlEncode(StringResourceManager.GetString(LocStringId.SocialComment_NeedAuthenticatedMessage));
  7.         text = string.Format(CultureInfo.InvariantCulture, "<span>{0}</span>", new object[]
  8.         {
  9.             text
  10.         });
  11.         this.Controls.Add(new LiteralControl(text));
  12.         return;
  13.     }
  14.     this.Controls.Add(new LiteralControl("<div class=\"ms-socialCommentContents\" id=\"" + this.RootElementId + "\">"));
  15.     if (this.IsShowNewArea)
  16.     {
  17.         this.RenderNewArea();
  18.     }
  19.     this.RenderEditArea();
  20.     this.RenderErrorArea();
  21.     this.RenderPagingControlContainer();
  22.     this.Controls.Add(new LiteralControl("<div id=\"" + this.ClientID + "_PlaceHolder\" />"));
  23.     this.Controls.Add(new LiteralControl("</div>"));
  24. }
A linha 14 mostra o problema. A tag div é self-closed, o que não funciona com html 5.

A solução para esse caso é simples. Pelo fato de não haver uma closing tag, adicionando-a o problema é eliminado.

Crie uma nova classe, faça a herança de SocialCommentControl e override o método CreateChildControls() adicionando a closing tag. Conforme exibido abaixo:

  1. public class SocialCommentHtml5Control : SocialCommentControl
  2.     {
  3.         protected override void CreateChildControls()
  4.         {
  5.             base.CreateChildControls();
  6.             this.Controls.Add((Control)new LiteralControl("</div>"));
  7.         }
  8.     }

É isso. Adicione o controle a sua page layout e utilize no SP2013.

Espero que isso ajude.

[]’s,

Referência:
Microsoft Forum

Clique aqui para ler o mesmo conteúdo em Inglês.