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:
- protected override void CreateChildControls()
- {
- base.CreateChildControls();
- if (!this.IsUPAEnabled)
- {
- string text = SPHttpUtility.HtmlEncode(StringResourceManager.GetString(LocStringId.SocialComment_NeedAuthenticatedMessage));
- text = string.Format(CultureInfo.InvariantCulture, "<span>{0}</span>", new object[]
- {
- text
- });
- this.Controls.Add(new LiteralControl(text));
- return;
- }
- this.Controls.Add(new LiteralControl("<div class=\"ms-socialCommentContents\" id=\"" + this.RootElementId + "\">"));
- if (this.IsShowNewArea)
- {
- this.RenderNewArea();
- }
- this.RenderEditArea();
- this.RenderErrorArea();
- this.RenderPagingControlContainer();
- this.Controls.Add(new LiteralControl("<div id=\"" + this.ClientID + "_PlaceHolder\" />"));
- this.Controls.Add(new LiteralControl("</div>"));
- }
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:
- public class SocialCommentHtml5Control : SocialCommentControl
- {
- protected override void CreateChildControls()
- {
- base.CreateChildControls();
- this.Controls.Add((Control)new LiteralControl("</div>"));
- }
- }
É 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.