我可以确认这仍然发生在SSRS 2005上.Firefox不是唯一的浏览器,它不会按照报表设计者的意图进行渲染。显然,如果在元素上分配了多个样式属性,IE7(也可能是IE6)会假定最后一个样式属性为“赢”。标准模式下的IE8和Firefox在这种情况下承担第一种风格的属性来“赢”。我认为所有符合标准的浏览器都会和IE8和Firefox做出同样的选择,虽然我们的团队还没有测试过。
我还没有找到一个解决方案的修补程序,但我确实有办法阻止错误的HTML到浏览器。 OMG小马 - 感谢发布该链接到JudyX的帖子。 Wodeh回复说,在这篇文章的3/4中有一个很好的解决方案 - 不幸的是,如何使用已发布的代码并不完全清楚。
该方法是在包含ReportViewer Control的页面上使用response filter。过滤器可以访问将被发送到浏览器的原始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()方法:
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);
}
}
}
如何在CSS中定义最小高度以阻止页面生成在错误的HTML元素中引入样式属性? – 2009-07-16 17:19:58