• <menu id="w2i4a"></menu>
  • logo FastReport.Net教程2019

    文檔首頁>>FastReport.Net教程2019>>FastReport教程:如何在Angular單頁面應(yīng)用程序中使用Online Designer

    FastReport教程:如何在Angular單頁面應(yīng)用程序中使用Online Designer


    下載FastReport.Net最新版本

    FastReport.Net在線訂購火熱進(jìn)行中,立可享受特別優(yōu)惠!點此鏈接,速來搶購?。?!

    在本文中,我們將介紹在基于Angular框架和ASP .Net Core的單頁面應(yīng)用程序中使用FastReport Online Designer的方法。由于此SPA應(yīng)用程序的后端是在ASP .Net Core上實現(xiàn)的,因此我們可以輕松使用FastReport庫。仍然只有一個問題:如何在Angular客戶端應(yīng)用程序中顯示W(wǎng)eb報表對象。

    您可能知道第一個版本中的Angular框架是在JavaScript中實現(xiàn)的。所有后續(xù)版本都是用TypeScript編寫的?,F(xiàn)在,Angular的第一個版本被稱為AngularJS,而其他版本則有數(shù)字索引:2,3,... 7.我們將基于Angular 7創(chuàng)建一個演示應(yīng)用程序。

    在我們開始開發(fā)之前,讓我們?yōu)榄h(huán)境做好準(zhǔn)備。您需要安裝Node js平臺。它將在服務(wù)器端啟用JavaScript。從制造商的網(wǎng)站https://nodejs.org/en/下載該發(fā)行版并安裝。Node js包含NPM包管理器,它允許我們使用控制臺命令安裝用JavaScript編寫的必要庫。此外,您必須安裝.Net Core SDK 2.0及更高版本。

    要快速創(chuàng)建演示應(yīng)用程序,請使用Windows命令提示符。我們啟動cmd,然后傳遞到我們要創(chuàng)建項目的目錄。我們執(zhí)行命令:

    dotnet new angular -o AngularOnlineDesignerFRCore

    接下來,我們需要一個在線設(shè)計器。首先需要在設(shè)計器中為.Net Core框架組裝一個新的在線設(shè)計器

    FastReport

    在Visual Studio中打開我們的項目。使用在線設(shè)計器下載存檔后,將其解壓縮到項目中的wwwroot文件夾。

    現(xiàn)在我們將使用NuGet包管理器將FastReport庫添加到項目中。在管理器的右上角有一個包源的下拉列表。我們需要一個本地來源。但是你需要配置它。要執(zhí)行此操作,請單擊下一個齒輪形式的圖標(biāo)。接下來,選擇本地源并為其設(shè)置本地磁盤上目錄的路徑:

    C:\ Program Files(x86)\ FastReports \ FastReport.Net \ Nugets。完成設(shè)置后,安裝兩個可用的軟件包:FastReport.Core和FastReport.Web。

    FastReport

    要在項目中使用FastReport,還需要在指定的方法中將以下行添加到Sturtup.cs文件中:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
     {
    …
     app.UseFastReport();
    …
    }

    要將報表上傳到設(shè)計器,我們需要將必要的報表模板添加到服務(wù)器。為此,請在項目根目錄中創(chuàng)建App_Data文件夾。從FastReport.Net delivery,Demos / Reports文件夾中添加幾個報告模板。另外,從此文件夾中復(fù)制nwind.xml數(shù)據(jù)文件:

    FastReport

    現(xiàn)在我們可以開始編程。我們有一個控制器 - SampleDataController。由于我們使用示例頁面創(chuàng)建了一個演示應(yīng)用程序,因此我們在控制器和客戶端中都有不必要的元素。讓我們從SampleDataController.cs控制器中刪除所有方法并添加我們自己的方法。

    using System;
    using Microsoft.AspNetCore.Mvc;
    using FastReport.Web;
    using System.IO;
     
    namespace AngularOnlineDesignerFRCore.Controllers
    {
     [Route("api/[controller]")]
     public class SampleDataController : Controller
     {
     [HttpGet("[action]")]
     public IActionResult Design(string report)
     {
     WebReport WebReport = new WebReport();
     WebReport.Width = "1000";
     WebReport.Height = "1000";
     WebReport.Report.Load("App_Data/"+report+".frx"); // Load the report into the WebReport object
     System.Data.DataSet dataSet = new System.Data.DataSet(); // Create a data source
     dataSet.ReadXml("App_Data/nwind.xml"); // Open the xml database
     WebReport.Report.RegisterData(dataSet, "NorthWind"); // Registering the data source in the report
     WebReport.Mode = WebReportMode.Designer; // Set the web report object mode - designer display
     WebReport.DesignerLocale = "en";
     WebReport.DesignerPath = @"WebReportDesigner/index.html"; // We set the URL of the online designer
     WebReport.DesignerSaveCallBack = @"api/SampleData/SaveDesignedReport"; // Set the view URL for the report save method
     WebReport.Debug = true;
     ViewBag.WebReport = WebReport; // pass the report to View
     return View();
     }
     
     [HttpPost("[action]")]
     // call-back for save the designed report
     public IActionResult SaveDesignedReport(string reportID, string reportUUID)
     {
     ViewBag.Message = String.Format("Confirmed {0} {1}", reportID, reportUUID); // We set the message for representation
     Stream reportForSave = Request.Body; // Write the result of the Post request to the stream.
     string pathToSave = @"App_Data/TestReport.frx"; // get the path to save the file
     using (FileStream file = new FileStream(pathToSave, FileMode.Create)) // Create a file stream
     {
     reportForSave.CopyTo(file); // Save query result to file
     }
     return View();
     }
     }
    }

    第一個Design方法采用report參數(shù),該參數(shù)是要加載的報表的名稱。我們創(chuàng)建報表對象,將報表模板加載到報表對象中并連接數(shù)據(jù)源。接下來,打開報表對象的設(shè)計模式,設(shè)置設(shè)計器在線頁面的路徑以及報表保存方法的路徑。

    第二種方法是保存報表的回調(diào)。通過單擊設(shè)計器中的“保存”按鈕,我們將啟動一個將觸發(fā)此回調(diào)的保存事件。在此方法中,我們實現(xiàn)了將報表文件保存在服務(wù)器上作為TestReport。

    對于這些方法,您需要創(chuàng)建視圖。但在我們的項目中沒有Views文件夾。讓我們在項目的根目錄創(chuàng)建它。在其中,您需要創(chuàng)建另一個文件夾 - SampleData。在這里我們添加視圖。首先是Design方法。該文件以相同的方式調(diào)用,其內(nèi)容非常簡潔:

    @await ViewBag.WebReport.Render();

     我們只輸出Web報表對象。Render方法將其轉(zhuǎn)換為html。為SaveDesignedReport方法添加另一個視圖:

    @ ViewBag.Message

    此視圖顯示保存報表事件的狀態(tài)消息。

    在這個階段,服務(wù)器端編程可以被認(rèn)為是完整的。去前端。

    與單頁應(yīng)用程序相關(guān)的所有內(nèi)容都位于ClientApp目錄中。將其部署到解決方案瀏覽器。在里面我們對src文件夾感興趣,然后是應(yīng)用程序。

    對于顯示主頁面組件,app.component.ts負(fù)責(zé)。我們要編輯它:

    import { Component } from '@angular/core';
     
    @Component({
     selector: 'app-root',
     templateUrl: './app.component.html',
     styleUrls: ['./app.component.css'],
    })
     
    export class AppComponent {
    }

    但首先,請考慮app.component.html文件中的頁面模板:

    TextMaster-Detail

    你注意到的第一件事是單選按鈕。使用它們,我們將選擇需要在在線設(shè)計器中打開的兩個報表一。單選按鈕訂閱了該事件(單擊)。此事件設(shè)置變量報表的值。我們將在最終確定應(yīng)用程序組件時討論它。

    接下來是按鈕,它也訂閱了click事件。Clicked()函數(shù)由此事件調(diào)用。下一個div有一個條件 - 如果flag變量為true,則顯示嵌套的html代碼,我們從html變量中獲取。但要注意safeHtml函數(shù),我們通過管道將其應(yīng)用于html變量。此函數(shù)規(guī)范化html代碼,使其安全且適合嵌入DOM。

    我們必須實現(xiàn)此功能。為此,請在當(dāng)前文件夾中創(chuàng)建一個新的打樣文件 - app。我們稱之為safeHtml.pipe.ts:

    import { PipeTransform, Pipe } from '@angular/core';
    import { DomSanitizer } from '@angular/platform-browser';
     
    @Pipe({ name: 'safeHtml' })
    export class SafeHtmlPipe implements PipeTransform {
     constructor(private sanitized: DomSanitizer) { }
     transform(value) {
     return this.sanitized.bypassSecurityTrustHtml(value);
     }
    }

    DomSanitizer庫為我們完成所有工作,您只需要將html代碼提供給bypassSecurityTrustHtml方法。

    讓我們回到應(yīng)用程序組件。我們在其中實現(xiàn)了Clicked()函數(shù)

    import { Component } from '@angular/core';
    import { HttpClient } from "@angular/common/http";
     
    @Component({
     selector: 'app-root',
     templateUrl: './app.component.html',
     styleUrls: ['./app.component.css'],
     providers: [HttpService]
    })
    export class AppComponent {
     html: string;
     flag: boolean;
     report: string;
     
    constructor(private http: HttpClient){ }
     Clicked() {
    this.flag = false;
    this.http.get('api/SampleData/Design?report='+report, { headers: { 'Accept': 'text/html' }, responseType: 'text' as 'text' }).).subscribe((data: string) => { this.html = data; this.flag = true });
     }
    }

    我們添加了一個接受HttpClient的類構(gòu)造函數(shù)。我們需要它來完成獲取請求。Clicked()函數(shù)設(shè)置flag變量的默認(rèn)值。接下來,它對Design控制器方法執(zhí)行g(shù)et請求。變量報告中的報告名稱作為參數(shù)傳遞。如果get請求收到成功響應(yīng),則flag變量設(shè)置為true。這將顯示報表設(shè)計器將顯示的div。

    但是,從組件向單獨的服務(wù)發(fā)出請求是一種好習(xí)慣。在當(dāng)前app目錄中創(chuàng)建http.service.ts腳本:

    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
     
    @Injectable()
    export class HttpService {
     constructor(private http: HttpClient) { }
     
     getData(report) {
     return this.http.get('api/SampleData/Design?report='+report, { headers: { 'Accept': 'text/html' }, responseType: 'text' as 'text' });
     }
    }

     現(xiàn)在讓我們轉(zhuǎn)換app.component.ts來使用它:

    import { Component } from '@angular/core';
    import { HttpService } from "./http.service";
     
    @Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css'],
    providers: [HttpService]
    })
    export class AppComponent {
    html: string;
    flag: boolean;
    report: string;
     
    constructor(private httpService: HttpService) {
    }
     
    Clicked() {
    this.flag = false;
    this.httpService.getData(this.report).subscribe((data: string) => { this.html = data; this.flag = true });
    }
    }

     為了在組件中加載和提供添加的模塊,需要將它們添加到app.module.ts:

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { FormsModule } from '@angular/forms';
    import { HttpClientModule } from '@angular/common/http';
    import { AppComponent } from './app.component';
    import { SafeHtmlPipe } from './safeHtml.pipe';
     
    @NgModule({
     declarations: [
     AppComponent,
     NavMenuComponent,
     SafeHtmlPipe
     ],
     imports: [
     BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }),
     HttpClientModule,
     FormsModule
     ],
     providers: [],
     bootstrap: [AppComponent]
    })
    export class AppModule { }

    現(xiàn)在,服務(wù)和管道都可以在AppComponent中使用。

    這足以啟動應(yīng)用程序并使用下載的報表顯示報表設(shè)計器。但有一個細(xì)微差別。由于WebReportDesigner應(yīng)位于wwwroot目錄中,因此無法使用后端的視圖來處理保存報表的事件。

    我們將通過代理后端的客戶來解救。因此,我們指出必須將請求發(fā)送到服務(wù)器端口,在我們的例子中是ng服務(wù)器。

    要配置代理,您需要在src目錄中創(chuàng)建proxy.config.json文件:

    {
     "/": {
     "target": "http://localhost:4200/",
     "secure": false,
     "logLevel": "debug"
     }
    }

     在我們的例子中,ng服務(wù)器端口是4200,但它可以是不同的。您可以通過從控制臺運行服務(wù)器來學(xué)習(xí)它。為此,請運行Windows命令行,使用cd命令轉(zhuǎn)到ClientApp目錄,然后運行:npm start。從下一個顯示的文本中,您可以看到所需的端口號。

    現(xiàn)在打開src目錄中的package.json文件并更改其中的以下設(shè)置:

    {
     "scripts": {
    …
     
     "start": "ng serve --proxy-config proxy.config.json",
    "build": "ng build --prod --output-path ../AngularOnlineDesignerFRCore/wwwroot",
     …
     }

    因此,我們?yōu)榇碇付伺渲梦募镃lientApp程序集設(shè)置了wwwroot文件夾。

    現(xiàn)在您可以運行應(yīng)用程序并評估已完成的工作。我們期待一個幾乎空的頁面,只有這些控件:

    FastReport

    讓我們選擇兩個報表中的一個,然后單擊ShowOnlineDesigner按鈕:

    FastReport

    設(shè)計器顯示加載的報表。單擊“報表”選項卡并單擊“保存”按鈕:

    FastReport

    如果正確配置了代理,您將在右側(cè)的綠色框中看到消息保存。報告文件保存在服務(wù)器上。

    在這一點上,我們將假設(shè)示范項目的工作已經(jīng)完成。讓我們總結(jié)一下。后端開發(fā)幾乎與常規(guī)ASP.Net Core應(yīng)用程序相同??紤]到我們在一個命令中生成了幾乎所有文件,改進(jìn)前端也不是那么困難。


    相關(guān)鏈接:

    關(guān)于產(chǎn)品的任何問題,歡迎咨詢在線客服>>

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();