我有一個包含2個專案、報告和Web的解決方案,在.net core 2.1中使用AlanJudenMvcReportViewer開發,在大約十幾個SSRS服務器報告上運行良好。 決定使用Microsoft.DotNet.UpgradeAssistant來遷移到net 5.0。遇到了許多錯誤,但我已經克服了這些錯誤:
。在net 5.0中運行任何報告,現在給我的是 "報告加載失敗,檢查報告引數",這實際上是一個500/內部服務器錯誤。 System.MissingMethodException。未找到方法:'Microsoft.AspNetCore.Mvc.JsonResult Microsoft.AspNetCore.Mvc.Controller.Json(System.Object, Newtonsoft.Json.JsonSerializerSettings)'
。錯誤發生在ReportViewer.cshtml/viewReportPage中:$.get("/Report/ViewReportPage/[email protected]()&page=" page "&" urlParams)
一些研究給了我。https://github.com/alanjuden/MvcReportViewer/issues/92(和其他):
... 有兩個解決方案,一個是修改Alan代碼中的ReportController,另一個是包括一個包的參考,并修改你的啟動,以指示MVC使用Newtonsoft JSON。
選項#1:在MvcReportViewer/ReportController/ViewReportPage方法中,完全替換以下代碼
new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver() });with... new System.Text.Json.JsonSerializerOptions());
選項 2:首先在你的專案的 .csproj 檔案中添加一個包參考,該檔案包含你的其它包參考......
然后,在您的 Startup.cs/ConfigureServices 方法中,指示 MVC 使用 Newtonsoft JSON... services.AddMvc().AddNewtonsoftJson();....
已經嘗試了選項#2 - 沒有變化,同樣的錯誤。 我不知道如何應用方案 1,因為我沒有看到要替換的代碼(這可能是問題所在)。我看到過關于使用早期版本軟體包的問題。
我正在使用的ReportController.cs是:
using System.Net;
using Microsoft.AspNetCore.Mvc;
using SSFA_Web.Models;
usingMicrosoft.EntityFrameworkCore.Mvc; usingSSFA_Web.Models; Microsoft.EntityFrameworkCore.Mvc;
using Microsoft.AspNetCore.Authorization;
namespaceSSFA_Web.Controllers
{
Authorize] [Authorize] 。
public class ReportController : AlanJuden.MvcReportViewer.ReportController >。
{
private readonly SSFA_SQLContext _context;
public ReportController(SSFA_SQLContext context)
{
_context = 背景關系。
}
protected override ICredentials NetworkCredentials
{
get
{
return new System.Net.NetworkCredential("Myusername"/span>, "Mypassword"/span>, "Mydomain"/span>) 。
}
}
protected override System.ServiceModel.HttpClientCredentialType ClientCredentialType
{
get
{
return System.ServiceModel.HttpClientCredentialType.Ntlm;
}
}
protected override string ReportServerUrl
{
get get
{
return "http://MyReportServer directory"/span>;
}
}
protected override bool UseCustomReportImagePath { get { return true; } }
protected override string ReportImagePath
{
get
{
return "/Report/ReportImage/?originalPath={0}"。
}
}
public ActionResult CalendarListing()。
{
var model = this.GetReportViewerModel(Request)。
model.ReportPath = "/Reports/CalendarListing"。
return View("ReportViewer", model);
}
//等等。
}
}
ReportViewer.cshtml是 :
@model AlanJuden.MvcReportViewer.ReportViewerModel
@使用AlanJuden.MvcReportViewer
@{
ViewBag.Title = "ReportViewer"。
Layout = "~/Views/Shared/_Layout.cshtml"。
}
<h2>ReportViewer</h2>
@section AdditionalHeadContent {
<link rel="styleheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="styleheet" href="~/lib/bootstrap/dist/css/select2.min.css" />
<link rel="styleheet" href="~/lib/bootstrap/dist/css/select2-bootstrap.min.css" />
<link rel="styleheet" href="~/lib/bootstrap/dist/css/mvcreportviewer-bootstrap.css" />
<style>
.行 {
margin-left: 0;
margin-right: 0;
}
</style>
<script src="~/lib/bootstrap/dist/js/select2.min.4.0.3.js"> </script>
<script src="~/lib/jquery/dist/jquery.highlight-5.js"> </script>
<script>
$(document).ready(function () {
_initializeReportViewerControls()。
$('.FirstPage, .ViewReport, .Refresh') .click(function () {
if (!$(this).attr('disabled') {
viewReportPage(1)。
}
});
$('.PreviousPage').click(function ( ) {
if (!$(this).attr('disabled') {
var page = parseInt($('#ReportViewerCurrentPage').val()) - 1;
viewReportPage(page)。
}
});
$('.NextPage').click(function ( ) {
if (!$(this).attr('disabled') {
var page = parseInt($('#ReportViewerCurrentPage') .val() 1;
viewReportPage(page)。
}
});
$('.LastPage').click(function ( ) {
if (!$(this).attr('disabled') {
var page = parseInt($('#ReportViewerTotalPages').text()) 。
viewReportPage(page)。
}
});
$('#ReportViewerCurrentPage').change(function () {
var page = $(this).val();
viewReportPage(page)。
});
$('.ExportXml, .ExportCsv, .ExportPdf, .ExportMhtml, .ExportExcelOpenXml, .ExportTiff, .ExportWordOpenXml') .click(function () {
exportReport($(this))。
});
$('#ReportViewerSearchText').on("keypress", function (e) {
if (e.keyCode == 13) {
//取消按鍵事件的默認動作。
e.preventDefault()。
findText()。
}
});
$('.FindTextButton').click(function ( ) {
findText()。
});
$('.Print').click(function () {
printReport()。
});
});
功能 _initializeReportViewerControls() {
$('select').select2()。
try {
ReportViewer_Register_OnChanges();
} catch (e) { }
}
function reloadParameters() {
var params = $('.ParametersContainer :input').serializeArray() 。
var urlParams = $.param(params) 。
showLoadingProgress("Updating Parameters...")。
$.get("/Report/ReloadParameters/[email protected]()&" urlParams).doing(function (data) {
if (data != null) {
$('.Parameters').html(data)。
_initializeReportViewerControls()。
if ($('.ReportViewerContent').find('div').length !=1) {
$('.ReportViewerContent').html('<div class="ReportViewerInformation"> Please fill parameters and run the report...</div> ');
}
}
hideLoadingProgress()。
});
}
function showLoadingProgress(message) {
hideLoadingProgress()。
$('.ReportViewerContent').hide()。
$('.ReportViewerContentContainer') 。 append('<div class="loadingContainer">< div style="margin: 0 auto; width: 100%; text-align: center; vertical-align: middle;"><h2><i class="glyphicon glyphicon-refresh gly-spin"></i>' message '</h2></div></div> ')。
}
function hideLoadingProgress() {
$('.loadingContainer'/span>).remove()。
$('.ReportViewerContent').show()。
}
function printReport() {
var params = $('.ParametersContainer :input').serializeArray() 。
var urlParams = $.param(params) 。
window.open("/Report/PrintReport/[email protected]()&" urlParams, "_blank");
}
function findText() {
$('.ReportViewerContent').removeHighlight()。
var searchText = $("#ReportViewerSearchText").val();
if (searchText != undefined && searchText != null && searchText != " ") {
showLoadingProgress('Searching Report...')。
var params = $('.ParametersContainer :input').serializeArray();
var urlParams = $.param(params) 。
var page = parseInt($('#ReportViewerCurrentPage').val();
$.get("/Report/FindStringInReport/[email protected]()&page=" page "&searchText=" searchText "&" urlParams).done(function (data) {
if (data > 0) {
viewReportPage(data, function () {
$('.ReportViewerContent').highlight(searchText)。
hideLoadingProgress()。
});
} else {
$('.ReportViewerContent').highlight(searchText, { wholeWord: false, ignoreCase: true, color: "#ffff00"/span>, bold: true })。)
hideLoadingProgress()。
}
});
}
}
function viewReportPage(page, afterReportLoadedCallback) {
showLoadingProgress('Loading Report Page...')。
var params = $('.ParametersContainer :input') .serializeArray();
var urlParams = $.param(params) 。
var totalPages = parseInt($('#ReportViewerTotalPages').text()。
if (page == undefined || page == null || page < 1) {
page = 1;
} else if (page > totalPages) {
page = totalPages;
}
$.get("/Report/ViewReportPage/[email protected]()&page="/span> page "&"/span> urlParams)
.done(function (data) {
updateReportContent(data);
hideLoadingProgress()。
if (afterReportLoadedCallback && typeof (afterReportLoadedCallback) == "function" /span>) {
afterReportLoadedCallback()。
}
})
.失敗(function (data) {
$('.ReportViewerContent').html("<div class='ReportViewerError'>報告加載失敗,檢查報告引數...</div> ")。
hideLoadingProgress()。
});
}
function exportReport(element) {
var params = $('.ParametersContainer :input').serializeArray() 。
var urlParams = $.param(params) 。
var format = $(element).attr('class').replace(" Export", "")
window.location.href = "/Report/ExportReport/[email protected]()&format=" format "&" urlParams;
}
function updateReportContent(data) {
if (data != undefined && data != null) {
$('#ReportViewerCurrentPage').val(data.CurrentPage)。
$('#ReportViewerTotalPages').text(data.TotalPages)。
$('.ReportViewerContent').html($.parseHTML(data.Content))。
if (data.TotalPages <= 1) {
$('.FirstPage').attr('disabled', true)。
$('.PreviousPage').attr('disabled', true)。
$('.NextPage').attr('disabled', true)。
$('.LastPage').attr('disabled', true)。
} else {
$('.FirstPage').attr('disabled', false) 。
$('.PreviousPage').attr('disabled', false)。
$('.NextPage').attr('disabled', false)。
$('.LastPage').attr('disabled', false)。
}
}
}
</script>
}
@section Content {
@Html.RenderReportViewer(Model)
}
希望得到任何幫助。
uj5u.com熱心網友回復:
我不確定這是否有幫助,但是簽名顯然已經從
改變了。Json(Object, JsonSerializerSettings)
to
Json(Object, Object)
通過檔案
data Object要序列化的物件。
serializerSettings Object格式化器將使用的序列化設定。
當使用System.Text.Json時,這應該是System.Text.Json的一個實體。 JsonSerializerOptions的實體。
當使用 Newtonsoft.Json 時,這應該是一個 JsonSerializerSettings.
。
因此,據推測該方法仍應接受相同的物件。但是如果你有使用舊方法簽名的東西,你要么需要更新參考,要么需要更新呼叫該方法的庫。畢竟,方法決議發生在你編譯源代碼的時候。當它到達抖動時,方法簽名需要完全匹配。
不幸的是,我對asp.net以及.net core 2與.net 5的了解不夠,無法提供更具體的建議。
uj5u.com熱心網友回復:
答案。(我只是部分理解)
感謝@Nick.McDermaid和@JonasH的幫助
。回到AlanJuden的GitHub上,發現他的另一個控制器為ViewReportPage提供了不同的方法,并參考了方案1中提到的代碼。
將其復制到我的控制器中(對錯誤進行了一些修改,并對前面提到的System.Text.Json進行了修改,作為方案#1),嘗試讓System.Text.Json.JsonSerializerOptions()作業。
IE在報告ActionResults前的ReportController.cs中添加了以下內容。
public new JsonResult ViewReportPage(span class="hljs-built_in">string reportPath, int? page = 0)?
{
var model = this.GetReportViewerModel(Request);
model.ViewMode = AlanJuden.MvcReportViewer.ReportViewModes.View。
model.ReportPath = reportPath;
var contentData = AlanJuden.MvcReportViewer.ReportServiceHelpers.ExportReportToFormat(model, AlanJuden.MvcReportViewer.ReportFormats.Html4_0, page, page) 。
var content = model.Encoding.GetString(contentData.ReportData)。
if (model.UseCustomReportImagePath && model.ReportImagePath.HasValue()
{
content = AlanJuden.MvcReportViewer.ReportServiceHelpers.ReplaceImageUrls(model, content)。
}
var jsonResult = Json(
new
{
contentData.CurrentPage,
內容 = content.CurrentPage
contentData.TotalPages
},
new System.Text.Json.JsonSerializerOptions())。)
return jsonResult;
當我運行這個時,在$get代碼處(F12 Developer Tools/network tab/body),我得到一個不同的500錯誤--請求匹配了多個端點。匹配了。 SSFA_Web.Controllers.ReportController.ViewReportPage (SSFA_Web) SSFA_Web.Controllers.ReportController.ViewReportPage (SSFA_Web)
。我假設1個來自我的控制器mods,1個來自AlanJudens dll.
。最終(幾天后)發現這樣做是可行的:
Changed ReportController.cs/JsonResult:從 public new JsonResult ViewReportPage(string reportPath, int? page = 0)
到 public JsonResult ViewReportPage(string reportPath, int? page = 0)
To public JsonResult ViewReportPageX(string reportPath, int? page = 0)
Changed ReportViewer.cshtml/viewReportPage
從$.get("/Report/viewReportPage/[email protected]()&page=" page "&" urlParams)
To $.get("/Report/viewReportPageX/[email protected]()&page=" page "&" urlParams)
很可能不應該這樣做,但它可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324075.html
標籤:
