我可以确认 SSRS 2005 仍然会发生这种情况。Firefox 并不是唯一不会按照报表设计器的预期呈现的浏览器。显然,如果在一个元素上分配了多个样式属性,则 IE7(可能还有 IE6)假定最后一个样式属性为“赢”。在这种情况下,标准模式下的 IE8 和 Firefox 假定第一个样式属性为“赢”。我会假设所有符合标准的浏览器都会做出与 IE8 和 Firefox 相同的选择,尽管我们的团队尚未对此进行测试。
我还没有找到关于修补程序的解决方案,但我确实有办法防止坏的 HTML 进入浏览器。OMG Ponies - 感谢您将链接发布到 JudyX 的帖子。Wodeh 在该帖子的 3/4 处给出了一个很好的解决方案 - 不幸的是,尚不完全清楚如何使用发布的代码。
该方法是在包含ReportViewer 控件的页面上使用响应过滤器。过滤器可以访问将发送到浏览器的原始 HTML,这提供了直接修改 HTML 的机会,而不必导致新的第一列技巧。在我们的 Page_Load 方法中,我们使用以下代码设置 Response.Filter 属性:
protected void Page_Load(object sender, EventArgs e)
{
Response.Filter = new CorrectSSRSIssuesResponseFilter(Response.Filter);
if (!IsPostBack) {
RenderReport();
}
}
CorrectSSRSIssuesResponseFilter 类定义如下,主要基于 Wodeh 帖子中的代码。秘诀在于 Write() 方法,它使用 RegEx 消除第一个样式属性:
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);
}
}
}