跳到主要內容

發表文章

目前顯示的是 2019的文章

asp.net core 整合 bootstrap 第三方套件 AdminLTE

過去開發asp.net、asp.net mvc,曾經透過layout 或是 masterpage 設定bootstrap的RWD 模板,並且調用其他非官方的plugin 進行開發測試 同樣 asp.net core 的開發上,將來也會有相同的需求,因此也是透過之前使用的AdminLTE進行開發,這在官網也有最新版本的範本demo https://adminlte.io/themes/dev/AdminLTE/index.html 一、下載AdminLTE 筆者在開發上,所使用的是如圖中這兩個版本 二、建立Asp.Net Core 專案 首先透過命令列,在專案資料夾建立一個Asp.Net Core的MVC專案 D:\ASpNetCoreMvc1\dotnet new mvc 三、Asp.Net Core 檔案配置 接著依據AdminLTE-master 的架構,進行靜態檔案的配置 在asp.net core 的靜態檔案架構上,跟過去在asp.net 的方法也有很大的變革,這個必須配置在wwwroot的資料夾,所以筆者將套件包的檔案下載後,直接複製到 wwwroot 進行設定 內部有些檔案是我自己另外寫的,但大致結構仍以RWD為主的配置。另外如果靜態檔案未配置於wwwroot資料夾,網頁執行後將無法執行css及js 四、進行Layout檔案配置更新 回歸到版面配置重點,在 _Layout 的靜態檔案版面配置方式,其實與asp.net 沒有太大的改變 @RenderBody() 這裡是版面內要處理的部份 五、執行網頁

asp.net core 設定驗定權限驗證

近日來利用工作空檔,研究了asp.net core權限驗證機制, 並且透過 AuthorizationFilter 實作action 端的權限過濾。 過去在 asp.net 的mvc 有類似的做法,在asp.net core 其實也是大同小異。 asp.net mvc 也一樣是透過ActionFilter 處理權限過濾,Sam是透過cookie將加密資訊進行記錄。 這裡Account 是登錄的使用者帳號資訊,記錄於UserAuth,並且設置有效時間為1小時 var hc = new HttpCookie("UserAuth",Account) {     Expires = DateTime.Now.AddHours(1),     HttpOnly = true }; Response.Cookies.Add(hc); 在.net core的部份,權限設置已經較為簡化,但仍有需要注意的「眉角」: 首先在Startup.cs 的 ConfigureServices,必須設置系統授權的有效時間,以及指定登入登出頁面:       services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)      .AddCookie(option=>             {                 option.LoginPath = new PathString("/Login/Index");   //設定登入頁Action                 option.LogoutPath = new PathString("/Home/Index");//設定登出頁Action                 //設定cookie 有效時間,這部份也可以在登入的時候進行設置                 option.ExpireTimeSpan = TimeSpan.FromMinutes(60);//設定到期時間限制             }); 另外在 Configure 的部份,啟用R

Python 類別擴充方法

最近在使用 Python 的集合物件進行資料處理, 過程中發現某些時候,需要另外撰寫方法取得特定資料,例如 def fill_tag_data ():     for i in range ( 0 , 999 ):         tag = {}         tag[ "TagNo" ] = '5' + '{0:0>3}' .format(i)         tag[ "TagName" ] = '5' + '{0:0>3}' .format(i)         TagData.append(tag) TagData = [] # 定義為 list 集合 def first_element (pList):     if len(pList) > 0:         return pList[ 0 ]     else :         return { "TagNo" : "5000" , "TagName" : "5000" } 其中 first_element 是定義用來取得 list 的第一筆記錄的方法,需透過 first_data = first_element(TagData) 進行操作,當然也可以透過 TagData[0] ,得到第一筆記錄 但美中不足的是,我們必須確定 TagData 這個 list 的長度大於 0 ,才能夠取得 TagData[0] 因此在取回 TagData[0] 以前,會另外撰寫判別式 if(len(TagData)>0):      none 於是我在這裡另外建立一個 ListPackage 類別,並且繼承 list class ListPackage ( list ):     def __str__ ( self ):         return "this is new list obj" 這邊建立 ListPackage(list) 的原因稍後

Quartz.net 升級測試

因為工作的關係,有個程式功能需要透過一個穩定排程工具進行處理,評估之後選擇了Quartz.Net 我是透過.net 的NuGet套件進行下載安裝,這個版本(V3.0.6)必須使用.net 4.5.2之後的版本 進到程式裡面,開發環境的設定初始化,建立ScheduleFactory、Scheduler 這部份需建立兩個全域的物件,StdSchedulerFactory與Scheduler 建立工作及觸發器 由於筆者是在windows form專案,因此在Form_Load階段必須建立工作流程 在TestAsyncJob裡面 建立了 IJobDetail 類別job,並註冊CsCountJob(自定的工作執行器) 建立 ITrigger  trigger工作觸發器 Trigger的觸發方式有蠻多的,例如 WithSimpleSchedule、WithDailyTimeIntervalSchedule、WithCronSchedule及WithCalendarIntervalSchedule 這次專案是使用WithDailyTimeIntervalSchedule,並設定每5秒進行一次trigger 完成Job與Trigger 的宣告後,再加入到Scheduler的工作排程 創建工作實體物件 CsCountJob是由 IJobDetail 所註冊的工作實體, 用來執行所排定的工作內容,實作IJob介面 Execute method,是實作IJob的工作執行方法,可以放置要進行執行的工作區段 目前Execute內部是用來處理Udp通訊封包的資料接收,並即時回饋至UI。 JobDataMap 物件是由 IJobDetail 所定義的參數容器,主要是用來傳遞工作執行所需要的參數資訊。 另外在工作實體的宣告,在工作類別會使用 DisallowConcurrentExecution 進行過濾,主因是工作排程是每5秒一次,但若單次的工作執行階段會超過Trigger的秒數時間,為避免排程出現干擾的狀況,必須在類別宣告[ DisallowConcurrentExecution ],若當次排程尚未完成,則在trigger後的工作執行緒,將