只要用戶通過單擊加號展開行組,就可以通過自動滾動網頁來相信它正在「有幫助」。駭客微軟DLL,沒有人知道一種方法來阻止這種行爲?Reporting Services在展開時自動滾動到錨點
在網上搜索,我發現this years-old thread discussing the same issue,但沒有答案。我希望我在SO的朋友可能會更有知識。
只要用戶通過單擊加號展開行組,就可以通過自動滾動網頁來相信它正在「有幫助」。駭客微軟DLL,沒有人知道一種方法來阻止這種行爲?Reporting Services在展開時自動滾動到錨點
在網上搜索,我發現this years-old thread discussing the same issue,但沒有答案。我希望我在SO的朋友可能會更有知識。
我剛剛遇到同樣的問題,並把一個骯髒的修復地方!我使用報告查看器控件在我自己的自定義ASP.Net頁面中顯示報告。這可以幫助我,因爲我可以在我的外部主機頁面中添加一些額外的腳本。以下是我所做的:
我在我的頁面上打開了MaintainScrollPositionOnPostback
,因爲我很懶,只是劫持他們的函數來計算滾動條的位置。
我設置了一個間隔來捕獲滾動條Y位置每50ms。
我將事件處理程序附加到SSRS IFrame的加載事件,該事件處理程序會將滾動條設置回以前的位置。
當SSRS發回iframe加載事件時。此時SSRS惱人地調整了滾動條。我的事件處理程序啓動並放回!這非常噁心,但是完成這項工作。
代碼:
<script language="javascript">
$(document).ready(function() {
$('iframe').load(function() {
resetScrollbar();
});
});
var lastGoodScrollY = 0;
var interval = window.setInterval(getScrollY, 50);
function getScrollY() {
lastGoodScrollY = WebForm_GetScrollY();
}
function resetScrollbar() {
window.scrollTo(0, lastGoodScrollY);
}
</script>
的澄清溶液很簡單,如果你知道如何做到這一點。 ;)
所有你需要做的就是將下面的代碼是什麼:
<script type="text/javascript" language="javascript">
$(document).ready(function() {
$('.A0').get(0).ClientController.CustomOnReportLoaded = function() {
this.m_reportObject.m_navigationId = null;
};
});
</script>
其中 「A0」 從$('.A0')
是分配給ReportViewer控件的CSS類名。
僅供參考我粘貼方法的初始化ReportViewer控件:
protected void InitializeReportViewer(string ID)
{
string reportsPath = ConfigGetter.GetReportsPath();
string reportingServerUrl = ConfigGetter.GetReportingServerUrl();
Instance = new ReportViewer();
Instance.ID = ID;
Instance.CssClass += ID;
Instance.ProcessingMode = ProcessingMode.Remote;
Instance.ServerReport.ReportServerUrl = new Uri(reportingServerUrl);
Instance.ServerReport.ReportPath = reportsPath + Config.Filename;
Instance.Enabled = true;
Instance.InternalBorderStyle = BorderStyle.None;
Instance.EnableViewState = true;
if (Config.AutomaticSize)
{
Instance.AsyncRendering = false;
Instance.SizeToReportContent = true;
}
else
{
Instance.Width = Config.Width;
Instance.Height = Config.Height;
}
Instance.ShowParameterPrompts = false;
Instance.ShowToolBar = false;
SetParameters();
}
被調用了上面的例子,如:
InitializeReportViewer("A0");
下面的解釋,爲什麼它的工作原理:
ReportViewer控件生成大量的javascript代碼,其中包含以下其他內容:
function OnLoadReport(reloadDocMap)
{
this.m_clientController.OnReportLoaded(this, reloadDocMap);
if (null != this.m_navigationId && this.m_navigationId != "")
window.location.replace("#" + this.m_navigationId);
if (this.m_autoRefreshAction != null)
setTimeout(this.m_autoRefreshAction, this.m_autoRefreshInterval);
}
RSReport.prototype.OnLoadReport = OnLoadReport;
function OnReportLoaded(reportObject, reloadDocMap)
{
this.m_reportObject = reportObject;
this.CurrentPage = reportObject.m_pageNumber;
this.TotalPages = reportObject.m_totalPages;
this.m_searchStartPage = reportObject.m_searchStartPage;
// Update the client side page number so that it is available to the server object
// if it was changed asynchronously.
var clientCurrentPage = GetControl(this.m_clientCurrentPageID);
if (clientCurrentPage != null)
clientCurrentPage.value = this.CurrentPage;
// If there is a document map, display it
if (this.HasDocumentMap())
{
// This method is called each time the report loads. This happens
// for page navigations and report actions. For many of these cases,
// the doc map didn't change, so don't reload it.
if (reloadDocMap)
{
if (this.CanDisplayBuiltInDocMap() && this.m_docMapUrl != "")
{
var docMapReportFrame = frames[this.m_docMapReportFrameID];
docMapReportFrame.frames["docmap"].location.replace(this.m_docMapUrl);
}
this.CustomOnReloadDocMap();
}
if (this.m_docMapVisible && this.CanDisplayBuiltInDocMap())
this.SetDocMapVisibility(true);
}
this.CustomOnReportLoaded();
}
惱人的滾動是因爲這部分代碼的:
if (null != this.m_navigationId && this.m_navigationId != "")
window.location.replace("#" + this.m_navigationId);
所以我們需要設置this.m_navigationId
爲null。 哪裏?
在這部分代碼this.m_clientController.OnReportLoaded
之前調用方法,最後調用方法CustomOnReportLoaded()
,所以我們只需要在這個方法中爲m_navigationId
設置null。 而我們正在這樣做。瞧!
與ReportViewer控件10.0.30319.1配合使用時適用於我。不是很漂亮,因爲它涉及_ReportArea,它應該是私有的,並且根本不需要ScrollToTarget函數,這在某些情況下可能是需要的。另一種方法是通過訪問控件來訪問ReportPage的這個函數和\或NavigationId屬性,但是您需要知道確切的控件ID - 在我的情況下,它是reportViewerDivId_ctl09,它是從rsweb的客戶端ID生成的: ReportViewer Asp.Net控件。 參見第二示例
實施例1:
$(window).load(function() {
if (Microsoft && Microsoft.Reporting && Microsoft.Reporting.WebFormsClient) {
var rpp = Microsoft.Reporting.WebFormsClient._ReportArea;
if (rpp && rpp.prototype) {
rpp.prototype.ScrollToTarget = function() { };
}
}
});
實施例2:
/* DOESN'T WORK!*/
var rp = $get('reportViewerDivId_ctl09_ReportControl'); /* rp.control is ReportPage */
rp[0].control.NavigationId = null;
/*THE BELOW WORKED*/
var ra = $('#reportViewerDivId_ctl09'); /*ra[0].control is ReportArea*/
if (ra[0] && ra[0].control && ra[0].control.ScrollToTarget) {
ra[0].control.ScrollToTarget = function() { }; /*overriding the function so that anoying scroll on Sort doesn't happen */
}
只要overright中的ReportViewer JS天然ScrollToTarget功能到ReportViewerWebForm.aspx:
$(document).ready(function() {
Microsoft.Reporting.WebFormsClient._ReportArea.prototype.ScrollToTarget = function(){};
});
清潔和它適用於IE11和Chrome。適合我!應該標記爲答案。 – 2018-01-16 18:05:56