Je peux confirmer que cela se produit encore avec SSRS 2005. Firefox n'est pas le seul navigateur qui ne rendra pas cela comme prévu par le concepteur de rapports. Apparemment, IE7 (et probablement IE6) suppose que le dernier attribut de style est "win" s'il y a plusieurs attributs de style assignés à un élément. IE8 en mode standard et Firefox assument le premier attribut de style à "gagner" dans cette situation. Je suppose que tous les navigateurs compatibles avec les normes feront le même choix que IE8 et Firefox, bien que notre équipe n'ait pas testé cela.
Je n'ai pas trouvé de solution en termes de correctif, mais j'ai un moyen d'empêcher le mauvais HTML de se rendre dans le navigateur. OMG Ponies - merci d'avoir posté ce lien vers le post de JudyX. Wodeh a répondu avec une bonne solution sur les 3/4 de ce post - malheureusement, il n'était pas tout à fait clair comment utiliser le code qui a été posté. L'approche est d'utiliser un response filter sur la page qui contient le ReportViewer Control. Le filtre a accès au code HTML brut qui sera envoyé au navigateur, ce qui permet de modifier le code HTML directement sans avoir à générer le nouveau tour de la première colonne. Dans notre méthode Page_Load, nous définissons la réponse.Filtre propriété avec le code suivant:
protected void Page_Load(object sender, EventArgs e)
{
Response.Filter = new CorrectSSRSIssuesResponseFilter(Response.Filter);
if (!IsPostBack) {
RenderReport();
}
}
La classe CorrectSSRSIssuesResponseFilter est définie comme suit et est principalement basée hors du code de Wodeh du poste. La sauce secrète est dans la méthode Write() qui utilise le RegEx pour effacer le premier attribut de style:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Reports
{
public class CorrectSSRSIssuesResponseFilter : Stream
{
private Stream _sink;
private StringBuilder Output = new StringBuilder();
public CorrectSSRSIssuesResponseFilter(Stream sink)
: base()
{
_sink = sink;
}
public CorrectSSRSIssuesResponseFilter()
: base()
{
_sink = new MemoryStream();
}
public override bool CanRead { get { return true; } }
public override bool CanSeek { get { return true; } }
public override bool CanWrite { get { return true; } }
public override void Flush()
{
_sink.Flush();
}
public override long Length
{
get { return _sink.Length; }
}
public override long Position
{
get
{ return _sink.Position; }
set
{ _sink.Position = value; }
}
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return _sink.Seek(offset, origin);
}
public override void SetLength(long value)
{
_sink.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
string strBuffer = UTF8Encoding.UTF8.GetString(buffer, offset, count);
//A Closing HTML tag indicates the response object has finished recieving the entire content of the page
strBuffer = System.Text.RegularExpressions.Regex.Replace(
strBuffer
, "<TD style=\"[^\"]*\" style=(?<goodStyle>\"[^\"]*\")>"
, "<TD style=${goodStyle}>"
, System.Text.RegularExpressions.RegexOptions.Compiled
);
buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
_sink.Write(buffer, offset, buffer.Length);
}
}
}
Comment la définition de min-height dans CSS va-t-elle empêcher la génération de page d'introduire un attribut de style dans le mauvais élément HTML? –