2016年10月19日 星期三
2016年10月12日 星期三
[筆記]Json Post 限制
參考:
如果要加大長度,在web.config中使用:
<appSettings> <add key="aspnet:MaxJsonDeserializerMembers" value="150000" /> </appSettings>
2016年9月18日 星期日
透過Email寫入OneNote(設定電子郵件至OneNote)
參考:
設定方式:
點擊[設定電子郵件至OneNote]
上方會出現email地址,請勾選要使用的email,如果想透過其它email,可以選新增其他地址。
進入介面後,選擇新增電子郵件。
新增電子郵件(新增別名),可以建立新的email帳號,或是使用GMail等帳號。
新增別名後,會需要驗證。
驗證之後,再回到地址頁面,可以看到介面上多出了其他email地址。
再來選擇你要發布的筆記本位置,並按下儲存,完成設定。
使用方式:
以Gmail為例,以收件人填上 me@ onenote.com,填上主旨與內文,並發送。
此時,就可以在onenote筆記上收到發送的文章。
2016年9月9日 星期五
[筆記]資料庫寫入中文變成亂碼
參考文章:
問題描述:
- 在輸入文字「憙」時,發現中文字變成亂碼。
解法一:
- 在寫入欄位時,使用TSQL 前綴N'憙',EX:Set Name=N'憙'
解法二:
- 查了當初寫入資料庫的語法,發現了問題點。
- SqlParameter tParam1 = new SqlParameter("@Name", SqlDbType.VarChar);
tParam1.Value = "憙"; - 資料庫中欄位的型態,設定是NVARCHAR;程式端設定為NVARCHAR,中文就可以正確寫入。
- SqlParameter tParam1 = new SqlParameter("@Name", SqlDbType.NVarChar);
tParam1.Value = "憙";
2016年9月5日 星期一
[筆記]商家商品引用分享
<div id="portfoliolist"></div> | |
<script src="http://code.jquery.com/jquery-1.10.2.js"></script> | |
<script src="http://web2.systemlead.com/iticket/scripts/jquery.tmpl.js"></script> | |
<!--產品範本定義--> | |
<script id="myTemplate" type="text/x-jquery-tmpl"> | |
<li class='product-div-wrap ${$data.ACTLBL} TOTAL' data-cat=''> | |
<div class='product-div' id='divTask${$data.ACTID}'> | |
<div class='img-wrap'> | |
<a style='display:block;' href='/eventdetail.html?actid=${$data.ACTID}'> | |
<img class='ACTPIC1' filename='${$data.ACTPIC1}' src='${$data.photoUrl }' /> | |
</a> | |
<span class='sArea' style="display:none"> | |
<i class='fa fa-map-marker'></i> | |
<span> | |
<a href='/Event.html?type=all&AREA=${$data.ACTADCTY}'>${$data.AreaNa}</a> | |
</span> | |
</span> | |
<span class='type-tag typeE'> | |
${$data.ACTKIND} | |
</span> | |
</div><!--//img-wrap--> | |
<div class='tags'> | |
<span class='typeP' > | |
<a href='/Event.html?type=all&AREA=${$data.ACTADCTY}'>${$data.AreaNa}</a> | |
</span> | |
<span class="actdtlad">${$data.ACTDTLAD}</span> | |
</div><!--//divTag--> | |
<!--<div class='tags' id='divTag${$data.ACTID}' > | |
<span class='typeP' style='display:none'> | |
<a href='/Event.html?type=all&tag=${$data.tag}'>${$data.ClassNa}</a> | |
</span> | |
</div> //divTag--> | |
<div class='info-wrap'> | |
<a style='display:block;' href='/eventdetail.html?actid=${$data.ACTID}'> | |
<h3>${$data.ACTNAME}</h3> | |
</a> | |
<div class='price'> | |
<span class='price1'>${$data.TOTCOUNT} | |
</span> | |
<span class='price2'>${$data.PRICE} | |
</span> | |
</div> | |
<button class='btn btn-main jsorderadd' id='${$data.ACTID}' price='${$data.PRICE}' jsordername='${$data.ProductName}' actpic1='${$data.ACTPIC1}'> | |
購買 | |
</button> | |
</div><!--//info-wrap--> | |
</div> | |
</li> | |
</script> | |
<script> | |
$(function () { | |
SearchResult(); | |
}); | |
//精選特惠 | |
function SearchResult() { | |
var pagesize='24'; | |
var pageindex = '1'; | |
var apiUrl ='https://aas.systemlead.com/api/values/?method=getaashmasdealsdata¶ms=40009993,' | |
+pageindex+',' | |
+pagesize; | |
//console.log(apiUrl); | |
// $('#portfoliolist').html(''); | |
$.ajax({ | |
url: apiUrl, | |
//data: null, | |
success: function (obj) { | |
var newobj = ($.parseJSON(obj)); | |
$.each(newobj,function(i,item) | |
{ | |
item.Tag = '';//首頁暫不放標籤排不下 | |
item.ProductName = item.ACTNAME;//商品名稱 | |
item.AreaNa = item.ACTADCTY; | |
//var classcode = item.ACTLBL.split(' ')[0].split('-')[1]; | |
item.ClassNa = "";//classcode; | |
item.photoUrl = 'http://iticket.s3.hicloud.net.tw/'+item.ACTPIC1; | |
}); | |
try{ | |
$('#myTemplate').tmpl(newobj, { | |
getTags: function (separator) { | |
return this.data.tags.join(separator); | |
} | |
}).appendTo($('#portfoliolist')); | |
} | |
catch(err){alert(err);} | |
//標籤 | |
$.each(newobj, function (i, item) { | |
//var targetObjId='#divTag'+item.ACTID; | |
//RetrieveActLbl($(targetObjId), item.ACTID); | |
}); | |
},fail: function (err) { | |
alert(err); | |
}, | |
dataType: 'JSON' | |
}); | |
} | |
</script> |
2016年7月1日 星期五
[筆記]ScriptManager.AsyncPostBackTimeout 屬性
有些程式執行會超過1分多鐘,postback運行後,發生timeout的情況。
有一部分是受到這個屬性的影響。這個屬性如過沒有設定,預設值是90秒。所以把此設定屬性拉長就可以。(通常ScriptManager會放在MasterPage中)
EX:
AsyncPostBackTimeout=”5000”
參考:
2016年6月29日 星期三
讀取GoogleSheet資料,並透過範本排版
讀取Googe Sheet的JSON資料,並透過JQuery.tmpl範本來進行排版。
<script src="http://code.jquery.com/jquery-1.10.2.js"></script> | |
<script src='http://web2.systemlead.com/iticket/scripts/jquery.tmpl.js'></script> | |
<script id="myTemplate" type="text/x-jquery-tmpl"> | |
<li class='product-div-wrap> | |
<div class='product-div'>${getColumData($data,'相關連結')} ${getColumData($data,'專案名稱')}</div> | |
</li> | |
</script> | |
<script> | |
$(function(){ | |
}); | |
function showsheetfeedcontent(data){ | |
try{ | |
$('#myTemplate').tmpl(data.feed.entry, { | |
getTags: function (separator) { | |
return this.data.tags.join(separator); | |
} | |
}).appendTo($('#portfoliolist')); | |
} | |
catch(err){alert(err);} | |
} | |
function getColumData(item,colName) | |
{ | |
var result='nodata'; | |
var searchStr = 'gsx$'+colName; | |
$.each(item, function (ii, iitem) { | |
if (ii.indexOf(searchStr ) > -1) | |
result= iitem.$t; | |
}); | |
return result; | |
} | |
</script> | |
<div id='portfoliolist'> | |
</div> | |
<!--google表單統計--> | |
<script type="text/javascript" src="https://spreadsheets.google.com/feeds/list/1cRGyaNQq0mUlSgTRmWKEXeFRID_tmATEe28h0Tno2cY/od6/public/full?alt=json-in-script&callback=showsheetfeedcontent"></script> |
補充:Google Sheet須發佈到網路,才可以使用JSON。
2016年6月28日 星期二
2016年6月12日 星期日
[筆記]asp.net postback後JQuery註冊事件失效
Asp.NET中,postback後會導致,JQuery註冊的事件失效。
參考
- https://msdn.microsoft.com/zh-tw/library/bb383810(v=vs.100).aspx
- 在完成非同步回傳,並將控制項傳回到瀏覽器之後,便會引發 endRequest 事件。 您可以使用這個事件提供通知給使用者或記錄錯誤。
<script src="http://code.jquery.com/jquery-1.10.2.js"></script> | |
<script type="text/javascript" language="javascript"> | |
//postback,jquery事件會失效 | |
//重新註冊按鈕事件 | |
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); | |
function EndRequestHandler(sender, args) | |
{ | |
initailEvent(); | |
} | |
$(function(){ | |
initailEvent(); | |
}); | |
//重新註冊事件 | |
function initailEvent(){ | |
$('#btnSend').click(function(){ | |
alert('OK'); | |
}); | |
} | |
</script> | |
<input id='btnSend' type='button' value='Send' /> |
[筆記]asp.net 防止double click
add_beginRequest事件會發生在請求之前,以下面例子,
當發生postback時,會先把觸發postback事件的物件(如按鈕)隱藏,
之後在畫面上面寫入【作業處理中,請稍候...】字樣,
之後執行完postback後要處理的功能後,畫面就會刷新還原。
<script src="http://code.jquery.com/jquery-1.10.2.js"></script> | |
<script type="text/javascript" language="javascript"> | |
//postback,先處理按鈕 | |
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); | |
function BeginRequestHandler(sender, args) | |
{ | |
var oControl = args.get_postBackElement(); | |
$(oControl).hide(); | |
$('#sMsg').html('作業處理中,請稍候...'); | |
} | |
</script> | |
<span id='sMsg'></span> |
2016年6月7日 星期二
2016年6月6日 星期一
[筆記]動態載入js
var apiurl = ‘abc.js';
var jsFile = document.createElement("script");
jsFile.setAttribute("type","text/javascript");
jsFile.setAttribute("src", apiurl);
document.getElementsByTagName("head")[0].appendChild(jsFile);
2016年4月17日 星期日
asp.net透過iframe下載檔案
網頁下載方法:常見
- 使用<a>網址下載的方式。
- 透過事件的方式來處理。比如click事件後,觸發下載檔案的方法。
如果要資料來源為資料庫或是要透過程式處理一些邏輯,
常見作法是使用Response.Write處理檔案的標頭內容等資訊,
但直接處理會破壞原先網頁的結構,
所以常透過泛型檔(.ashx)或另一個頁面(.aspx)來處理檔案下載的部分。
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Web; | |
using System.IO; | |
using System.Text; | |
namespace Web | |
{ | |
/// <summary> | |
///downloadFile 的摘要描述 | |
/// </summary> | |
public class downloadFile : IHttpHandler | |
{ | |
public void ProcessRequest(HttpContext context) | |
{ | |
this.TestDownloadFile(); | |
} | |
/// <summary> | |
/// 測試下載檔案 | |
/// </summary> | |
private void TestDownloadFile() | |
{ | |
HttpContext.Current.Response.ContentType = "text/plain"; | |
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + string.Format("text-{0}.txt", string.Format("{0:yyyyMMddHHmmss}", DateTime.Today))); | |
HttpContext.Current.Response.Clear(); | |
using (StreamWriter writer = new StreamWriter(HttpContext.Current.Response.OutputStream, Encoding.UTF8)) | |
{ | |
writer.Write("This is the content"); | |
} | |
HttpContext.Current.Response.End(); | |
} | |
public bool IsReusable | |
{ | |
get | |
{ | |
return false; | |
} | |
} | |
} | |
} |
在此要處理另外一個頁面處理下載檔案,可能會使用開窗或是導頁的方法。
- 開窗:可能會受到瀏覽器設定限制,阻擋廣告等機制。
- 導頁:會跑到另外一個頁面,但設計上可能不希望使用者離開原頁面。
網路上也提供另外一種做法,就是透過iframe的方式下載。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Web.Default" Theme="Red" %> | |
<%@ Register src="usercontrol1.ascx" tagname="usercontrol1" tagprefix="uc1" %> | |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml"> | |
<head runat="server"> | |
<title></title> | |
</head> | |
<body> | |
<form id="form1" runat="server"> | |
<div> | |
<asp:ScriptManager ID="scriptmanager1" runat="server"> | |
</asp:ScriptManager> | |
<asp:Button ID="btnDownload" runat="server" Text="下載" onclick="btnDownload_Click" /> | |
<div style="display:none"> | |
<!--iframe不可以display:none,可以在外面包div隱藏--> | |
<iframe id="iframeDownload" runat="server" style="width:0;height:0"></iframe> | |
</div> | |
</div> | |
</form> | |
</body> | |
</html> |
程式碼如下:
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Web; | |
using System.Web.UI; | |
using System.Web.UI.WebControls; | |
namespace Web | |
{ | |
public partial class Default : System.Web.UI.Page | |
{ | |
/// <summary> | |
/// 網頁讀取 | |
/// </summary> | |
/// <param name="sender"></param> | |
/// <param name="e"></param> | |
protected void Page_Load(object sender, EventArgs e) | |
{ | |
if (Page.IsPostBack) | |
return; | |
} | |
/// <summary> | |
/// 點擊[下載] | |
/// </summary> | |
/// <param name="sender"></param> | |
/// <param name="e"></param> | |
protected void btnDownload_Click(object sender, EventArgs e) | |
{ | |
//下載網址 | |
string downloadUrl = new Uri(new Uri(Request.Url.AbsoluteUri),"/downloadFile.ashx").AbsoluteUri; | |
//註冊下載網址給iframe | |
this.iframeDownload.Attributes.Add("src", downloadUrl); | |
//重整後網址是否清空,或其他邏輯再依照其他狀況處理 | |
} | |
} | |
} |
2016年3月1日 星期二
2016年2月14日 星期日
2016年2月2日 星期二
[筆記]查詢SQL SEVER連線數
select db_name(dbid) , count(*) 'connections count'
from master..sysprocesses
where 1=1
and spid > 50
group by db_name(dbid)
order by count(*) desc
2016年1月22日 星期五
2016年1月19日 星期二
取得Google OAuth 資訊
參考文章:[Asp.Net MVC] 使用Asp.Net Idetity整合Google登入
因為畫面有些許不同,在此做個筆記。
- 進入 https://console.developers.google.com/project。
- 點擊【建立專案】。
- 填入專案名稱,並選【建立】。
- 建立完專案後,點專案名稱,進入專案管理介面【資訊主頁】,並點擊【啟用和管理API】。
- 進入憑證,點擊【新增憑證】。
- 選擇【OAuth用戶端ID】
- 進入之後會提醒設定【設定同意畫面】。
- 進入【OAuth同意畫面】後,請填入產品名稱,並確認。
- 進入建立用戶端ID的畫面,選擇【網路應用程式】,並點擊【建立】。
- 建立憑證的限制,設定授權的網址,點擊【建立】後完成。
- 此時,即可取得OAuth的【用戶端ID】與【用戶端密鑰】。
- 建立完成之後,憑證清單上,即可看到新增完的憑證。
- 回到API管理員的【總攬】,可以看到【Google+ API】的選項,點擊進入,
確認API是否啟用。 - 點擊【啟用API】。
2016年1月14日 星期四
Microsoft.Jet.OLEDB.4.0' 提供者並未登錄於本機電腦上
參考文章:
,改為"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=…”。
2016年1月6日 星期三
資料庫排程備份
環境:
以下就是登入 SQL Server Management Studio 時操作的畫面。
開啟物件總管,SQL Server Agent > 按右鍵 >新增作業
依照左側選單依序設定,前三項是必要執行的:一般、步驟、排程。
這個設定如下圖直接設定即可。
每一個作業中可以設定多項步驟。進入[步驟],點擊下方的 [新增]
選取:類型、資料庫
再命令區中輸入要執行的T-SQL指令碼,可以點擊 [剖析] 測試是否可以正常執行。
T-SQL 指令建議事件撰寫好預存程序,在這個畫面上單純只是呼叫預存程序,不宜將太多程序放在這裡,避免日後要變更動作較繁瑣。
此處輸入自行撰寫的預存程序,主要功能是進行壓縮某一個資料庫的LOG檔案,完整語法可參閱
SQL 2008 Scheduling Backup and Shrink all db。
排程-設定
每一個作業中可以設定多項排程。進入[排程],點擊下方的 [新增]
進入排程設定畫面,選取要執行的類型、執行頻率、時間…等。
這三個設定後,點擊下方的 [確定],就完成一項新作業,可以在[物件總管]中會看到。
補充:壓縮語法
USE MyDB;
GO
-- changing the database recovery model to simple.
ALTER DATABASE MyDB
SET RECOVERY SIMPLE;
GO
-- Shrink UserDBlog file to 20 MB.
DBCC SHRINKFILE (MyDBlog, 20);
GO
-- changing the database recovery model to FULL.
ALTER DATABASE MyDB
SET RECOVERY FULL;
GO