我可以確認這仍然發生在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