<%
string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority + Request.ApplicationPath.TrimEnd('/') + "/";
%>
用法:
<script type="text/jscript">
var someurl = '<%=baseUrl%>subpath/somepage.aspx';
</script>
2019年7月25日 星期四
透過 javascript 但不使用 window.open 來開啟網址
目的是為了避免被瀏覽器阻擋
function openURL(url, target) {
var link = document.createElement("a");
link.href = url;
link.target = target;
document.body.appendChild(link);
link.onclick = function () {
requestAnimationFrame(function () {
document.body.removeChild(link);
delete link;
})
};
link.click();
}
openURL('http://www.google.com', '_new');
function openURL(url, target) {
var link = document.createElement("a");
link.href = url;
link.target = target;
document.body.appendChild(link);
link.onclick = function () {
requestAnimationFrame(function () {
document.body.removeChild(link);
delete link;
})
};
link.click();
}
openURL('http://www.google.com', '_new');
2019年7月8日 星期一
使用ag-grid 確保多人作業環境畫面永遠顯示最新資料
$scope.onTimeout = function () {
if (!$scope.new) // 處於某種狀態暫時不更新
{
$http.post('...')
.then(function (result) {
var oldlist = Enumerable.From($scope.gridOptions.api.getModel().rowsToDisplay).Select('$.data');
var newlist = Enumerable.From(result.data);
var 增加資料s = [];
newlist.ForEach(function (a) {
if (!oldlist.Any('$.id==' + a.id)) 增加資料s.push(a);
});
$scope.gridOptions.api.updateRowData({ add: 增加資料s, addIndex: 0 });
var 減少資料s = [];
oldlist.ForEach(function (a) {
if (!newlist.Any('$.id==' + a.id)) 減少資料s.push(a);
});
$scope.gridOptions.api.updateRowData({ remove: 減少資料s }); Enumerable.From($scope.gridOptions.api.getModel().rowsToDisplay).ForEach(function (node) {
var newdata = newlist.Where('$.id==' + node.data.id).SingleOrDefault();
if (newdata && JSON.stringify(node.data) != JSON.stringify(newdata)) {
node.setData(newdata);
$scope.gridOptions.api.redrawRows({ rowNodes: [node] });
}
});
}).finally(function (data) {
$timeout($scope.onTimeout, 10000);
});
}
else $timeout($scope.onTimeout, 10000);
}
$timeout($scope.onTimeout, 10000);
if (!$scope.new) // 處於某種狀態暫時不更新
{
$http.post('...')
.then(function (result) {
var oldlist = Enumerable.From($scope.gridOptions.api.getModel().rowsToDisplay).Select('$.data');
var newlist = Enumerable.From(result.data);
var 增加資料s = [];
newlist.ForEach(function (a) {
if (!oldlist.Any('$.id==' + a.id)) 增加資料s.push(a);
});
$scope.gridOptions.api.updateRowData({ add: 增加資料s, addIndex: 0 });
var 減少資料s = [];
oldlist.ForEach(function (a) {
if (!newlist.Any('$.id==' + a.id)) 減少資料s.push(a);
});
$scope.gridOptions.api.updateRowData({ remove: 減少資料s }); Enumerable.From($scope.gridOptions.api.getModel().rowsToDisplay).ForEach(function (node) {
var newdata = newlist.Where('$.id==' + node.data.id).SingleOrDefault();
if (newdata && JSON.stringify(node.data) != JSON.stringify(newdata)) {
node.setData(newdata);
$scope.gridOptions.api.redrawRows({ rowNodes: [node] });
}
});
}).finally(function (data) {
$timeout($scope.onTimeout, 10000);
});
}
else $timeout($scope.onTimeout, 10000);
}
$timeout($scope.onTimeout, 10000);
頁面內容不要cache 確保每次都抓最新資料
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.
※未經驗證
2019年7月6日 星期六
修改 line 畫面尺寸超過200%
開啟 C:\Users\[使用者帳號]\AppData\Local\Line\Data\LINE.ini
找到 scaleRatio=? (2=200%,3=300%)
若無此設定則手動添加
找到 scaleRatio=? (2=200%,3=300%)
若無此設定則手動添加
2019年7月5日 星期五
webmethod 回傳錯誤
var httpContext=System.Web.HttpContext.Current;
httpContext.Response.Write(錯誤訊息);
httpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
httpContext.Response.Flush();
httpContext.Response.SuppressContent = true;
httpContext.ApplicationInstance.CompleteRequest();
httpContext.Response.Write(錯誤訊息);
httpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
httpContext.Response.Flush();
httpContext.Response.SuppressContent = true;
httpContext.ApplicationInstance.CompleteRequest();
※若為 async 函數,await 後就無法再取得 System.Web.HttpContext.Current,必須先用變數記錄起來,await 之後再填回
var httpcontext = HttpContext.Current;
await xxxAsync().ConfigureAwait(false);
HttpContext.Current = httpcontext;
2019年7月1日 星期一
加密 web.config 避免敏感資料外洩
例如針對區段 connectionStrings 進行加密
cd C:\Windows\Microsoft.Net\Framework\v4.0.30319
aspnet_regiis -pef "connectionStrings" "[web.config 所在路徑]"
若為 winform app 則須先修改成 web.config
aspnet_regiis -pef "connectionStrings" "[web.config 所在路徑]"
若為 winform app 則須先修改成 web.config
主控台程式不顯示dos 視窗及 main 不要結束
不顯示dos 視窗
main 不要結束
====
最後呼叫 Console.ReadLine();
此時會等待使用者按下enter 才往下,因此不會直接結束程式
搭配"不顯示dos 視窗"就不會誤按enter 而結束程式
訂閱:
文章 (Atom)
input 連結 datalist 用程式控制彈出選項
範例: nextTick(() => document.querySelector('input').showPicker()); ※僅支援現代瀏覽器
-
1. 設定檔案下載儲存位置為 C:\Users\%username%\AppData\Local\Google\Chrome\User Data\Default\Cache 2. 勾選"下載每個檔案前詢問儲存位置" 3. 針對不要下載的檔案類型於第一...
-
自動設定欄寬 sheet.Cells.AutoFitColumns(3, 20); // 必須設定 min 跟 max 才會正常作用 凍結欄位 sheet.View.FreezePanes(4, 4); 標題列 ws.PrinterSettings.RepeatRo...
-
使用 FreeSpire.XLS ... ep.Save(); using (var workbook = new Workbook()) using (var memStream = new MemoryStream()) { workbook.LoadFromSt...