2012年12月19日 星期三
2012年12月10日 星期一
2012年11月21日 星期三
2012年11月14日 星期三
透過jQuery 呼叫webservice 取得datatable內容
專案參考Newtonsoft.Json.dll
server
====
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string GetScheduledActivity(string id)
{
DataTable dt = new DataTable();
...
return JsonConvert.SerializeObject(dt, Formatting.Indented);
}
client
====
$.ajax({
type: "POST",
url: "webservice1.asmx/GetScheduledActivity",
contentType: "application/json; charset=utf-8",
data: "{'id':'" + id + "'}",
dataType: "json",
success: function (jsonObj) {
var objdata = $.parseJSON(jsonObj.d);
// 只有一筆資料的用法
// objdata[0].欄位名稱
// 多筆資料的用法
$.each(objdata, function (i, val) {
// val.欄位名稱
});
}
});
server
====
[WebMethod]
[System.Web.Script.Services.ScriptMethod]
public string GetScheduledActivity(string id)
{
DataTable dt = new DataTable();
...
return JsonConvert.SerializeObject(dt, Formatting.Indented);
}
client
====
$.ajax({
type: "POST",
url: "webservice1.asmx/GetScheduledActivity",
contentType: "application/json; charset=utf-8",
data: "{'id':'" + id + "'}",
dataType: "json",
success: function (jsonObj) {
var objdata = $.parseJSON(jsonObj.d);
// 只有一筆資料的用法
// objdata[0].欄位名稱
// 多筆資料的用法
$.each(objdata, function (i, val) {
// val.欄位名稱
});
}
});
解決事件函數搭配資料繫結時單引號及雙引號混合所引發的問題
外圍用單引號,裡面的雙引號字元加上反斜線,如
onclick='<%#Eval("id","設定排定活動相關選項(\"{0}\");return false;")%>'
onclick='<%#Eval("id","設定排定活動相關選項(\"{0}\");return false;")%>'
2012年11月8日 星期四
server 事件未觸發?
使用AjaxControlToolkit CascadingDropDown之類或其他非postback方式動態改變control 內容,需加入 EnableEventValidation="false" 於 <%@ Page ,以避免 server 誤認資料被竄改而拒絕執行事件函數
2012年11月7日 星期三
2012年10月23日 星期二
ASP.NET 提示使用者下載檔案
Response.Clear()
Response.Buffer = True
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5")
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "交通住宿名單.xml")
Response.ContentType = "application/vnd.ms-excel"
Response.Write(filestream)
Response.End()
Response.Buffer = True
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5")
Response.AppendHeader("Content-Disposition", "attachment;filename=" + "交通住宿名單.xml")
Response.ContentType = "application/vnd.ms-excel"
Response.Write(filestream)
Response.End()
SQL SERVER 2005 如何於查詢結果加上序號欄位
select rank() OVER (ORDER BY a.au_lname, a.au_fname) as rank, a.au_lname, a.au_fname from authors a order by rank
透過 jQuery 呼叫 code-behind webmethod
於網頁中加入以下函數
====
function CallPageMethod(methodName, onSuccess) {
var args = '';
var l = arguments.length;
if (l > 2) {
for (var i = 2; i < l - 1; i += 2) {
if (args.length != 0) args += ',';
args += '"' + arguments[i] + '":"' + arguments[i + 1] + '"';
}
}
var loc = window.location.href;
loc = (loc.substr(loc.length - 1, 1) == "/") ? loc + "default.aspx" : loc;
$.ajax({
type: "POST",
url: loc + "/" + methodName,
data: "{" + args + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: onSuccess
});
}
呼叫方式
====
CallPageMethod([webmethod name], [成功時呼叫的函數名稱], [參數名稱1], [參數值1],[參數名稱2], [參數值2],...);
function [成功時呼叫的函數名稱](response) {
//do something, response.d=webmethod return value
}
2012年10月6日 星期六
使用EPPlus 時如何設定頁首頁尾
設定頁首中間文字並指定為標楷體、粗體、大小為16
====
ws.HeaderFooter.EvenHeader.CenteredText = ws.HeaderFooter.OddHeader.CenteredText = "&\"標楷體,Bold\"&16這是頁首中間文字";
設定頁尾右邊加入日期、時間、目前頁數、總頁數
====
ws.HeaderFooter.EvenFooter.RightAlignedText = ws.HeaderFooter.OddFooter.RightAlignedText = "{0} {1} {2}/{3}".FormatString(ExcelHeaderFooter.CurrentDate,ExcelHeaderFooter.CurrentTime,ExcelHeaderFooter.PageNumber,ExcelHeaderFooter.NumberOfPages);
====
ws.HeaderFooter.EvenHeader.CenteredText = ws.HeaderFooter.OddHeader.CenteredText = "&\"標楷體,Bold\"&16這是頁首中間文字";
設定頁尾右邊加入日期、時間、目前頁數、總頁數
====
ws.HeaderFooter.EvenFooter.RightAlignedText = ws.HeaderFooter.OddFooter.RightAlignedText = "{0} {1} {2}/{3}".FormatString(ExcelHeaderFooter.CurrentDate,ExcelHeaderFooter.CurrentTime,ExcelHeaderFooter.PageNumber,ExcelHeaderFooter.NumberOfPages);
2012年9月29日 星期六
2012年9月11日 星期二
使用updatepanel 時確保每次postback 都會呼叫函數的寫法
$(document).ready(function () {
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(function () {
......
});
prm.add_initializeRequest(...);
prm.add_endRequest(...);
});
頁面第一次進入時,會首先激發add_pageLoaded事件
異步提交時,事件的激發順序如下:
add_initializeRequest
add_beginRequest
add_pageLoading
add_pageLoaded
add_endRequest
add_pageLoaded
2012年8月27日 星期一
Lambda Expressions 範例
事件函數用法
(aComboBox as ComboBox).SelectionChanged += new SelectionChangedEventHandler((sender, e) => { ... });
(aComboBox as ComboBox).SelectionChanged += new SelectionChangedEventHandler((sender, e) => { ... });
2012年8月24日 星期五
LINQ查詢語法
select left join 回傳某個物件並依據關聯物件來設定某些屬性值
====
(from a in newlist
join b in db基本.產品資料檢視 on a.產品序號 equals b.產品編號 into b1
from b in b1.DefaultIfEmpty()
select new { a, b }).Select(a =>
{
a.a.產品名稱 = a.b == null ? a.a.產品名稱 : a.b.產品名稱;
return a.a;
})
※因為是left join,要使用關聯物件的屬性前需要先判斷物件是否為null 避免nullexception
equals 多個屬性
====
寫法有兩種,第一種寫法若有錯誤則必須改用第二種(原因不明)
1. new { 本次盤點.產品編號, 本次盤點.盤點單.倉庫 } equals new { 期初盤點.產品編號, 期初盤點.盤點單.倉庫 }
2. new { a=本次盤點.產品編號, b=本次盤點.盤點單.倉庫 } equals new { a=期初盤點.產品編號, b=期初盤點.盤點單.倉庫 }
group by 多個屬性
====
.GroupBy(a => new { a.銷貨資料.客戶編號, a.產品編號 })
order by 多個屬性
====
.OrderBy(a =>a.客戶編號).ThenBy(a=>a.產品編碼).ThenBy(a=>a.產品序號)
List
====
.Exists(p => ...) // 判斷是否存在特定物件
.Find(p => ...) // 尋找第一個特定物件
IEnumerable<T>
====
.Where(row => ...) // 尋找符合某些條件的row
(from a in 採購單明細Model.取得採購單明細列表(門市代號,採購單號) select a.交貨日期).Distinct() // 找出某個屬性不重複的資料並取出屬性值
.GroupBy(a => a.姓名).Select(a => a.First()) // 找出某個屬性不重複的資料並取出相同群組中第一個物件
從 IEnumerable 轉為 IEnumerable<T> 以便使用 .Where()
====
.Cast( <T>).Where(...)
====
(from a in newlist
join b in db基本.產品資料檢視 on a.產品序號 equals b.產品編號 into b1
from b in b1.DefaultIfEmpty()
select new { a, b }).Select(a =>
{
a.a.產品名稱 = a.b == null ? a.a.產品名稱 : a.b.產品名稱;
return a.a;
})
※因為是left join,要使用關聯物件的屬性前需要先判斷物件是否為null 避免nullexception
equals 多個屬性
====
寫法有兩種,第一種寫法若有錯誤則必須改用第二種(原因不明)
1. new { 本次盤點.產品編號, 本次盤點.盤點單.倉庫 } equals new { 期初盤點.產品編號, 期初盤點.盤點單.倉庫 }
2. new { a=本次盤點.產品編號, b=本次盤點.盤點單.倉庫 } equals new { a=期初盤點.產品編號, b=期初盤點.盤點單.倉庫 }
====
.GroupBy(a => new { a.銷貨資料.客戶編號, a.產品編號 })
order by 多個屬性
====
.OrderBy(a =>a.客戶編號).ThenBy(a=>a.產品編碼).ThenBy(a=>a.產品序號)
List
====
.Exists(p => ...) // 判斷是否存在特定物件
.Find(p => ...) // 尋找第一個特定物件
IEnumerable<T>
====
.Where(row => ...) // 尋找符合某些條件的row
(from a in 採購單明細Model.取得採購單明細列表(門市代號,採購單號) select a.交貨日期).Distinct() // 找出某個屬性不重複的資料並取出屬性值
.GroupBy(a => a.姓名).Select(a => a.First()) // 找出某個屬性不重複的資料並取出相同群組中第一個物件
從 IEnumerable 轉為 IEnumerable<T>
====
.Cast
2012年8月23日 星期四
2012年7月11日 星期三
網站地圖結合角色動態顯示選單
1. 登入頁認證通過時建立票證並加入cookie
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Login1.UserName, DateTime.Now, DateTime.Now.AddHours(8), false, [角色名稱(多個則以逗號隔開)]);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie([cookie名稱], encryptedTicket);
Response.Cookies.Add(authCookie);
2. Global.asax 認證通過後取得cookie 中的票證並建立GenericPrincipal存入Context.User
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (Context.User == null) return;
if (!Context.User.Identity.IsAuthenticated) return;
string cookieName = [cookie名稱];
if (!Context.Request.Cookies.AllKeys.Contains(cookieName)) return;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
FormsAuthenticationTicket authTicket = null;
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
string[] roles = authTicket.UserData.Split(new char[] { ',' });//如果有多個角色以逗號隔開則拆開
FormsIdentity id = new FormsIdentity(authTicket);
var principal = new System.Security.Principal.GenericPrincipal(id, roles);
Context.User = principal;//存到HttpContext.User中
}
3. 網站地圖(web.sitemap)設定各節點可存取角色
<sitemap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<sitemapnode roles="*" title="..."> <= 設定可以看到節點的角色,星號表示全部,若不設定則不會顯示
<sitemapnode description="..." title="..." url="..."> <= 包含網址的節點無法指定角色,會沒有作用
<sitemapnode description="..." title="..." url="...">
</sitemapnode>
</sitemapnode></sitemapnode></sitemap>
4. web.config 設定SiteMapProvider 及特定網頁可存取角色
<sitemap defaultprovider="XmlSiteMapProvider" enabled="true">
<providers>
<add description="SiteMap provider which reads in .sitemap XML files." name="XmlSiteMapProvider" securitytrimmingenabled="true" sitemapfile="Web.sitemap" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
</add></providers>
</sitemap>
說明 : SiteMapProvider 加入 securityTrimmingEnabled="true" 的選項以啟用角色控制節點機制
<location path="[網址]">
<system.web>
<authorization>
<allow roles="[允許的角色]" />
<deny users="*" />
</authorization>
</system.web>
</location>
說明 : 針對網址節點若要控制某些角色才能存取則使用 location 來指派角色
5. 於主頁面加入選單控制項並結合SiteMapProvider,在此以 treeview 為例
<asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ShowLines="True">
< /asp:TreeView>
< asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" SiteMapProvider="XmlSiteMapProvider" />
2012年6月18日 星期一
2012年6月7日 星期四
如何避免呼叫 Response.End、Response.Redirect 或 Server.Transfer 時遇到ThreadAbortException
•For Response.End, call the HttpContext.Current.ApplicationInstance.CompleteRequest method instead of Response.End to bypass the code execution to the Application_EndRequest event.
•For Response.Redirect, use an overload, Response.Redirect(String url, bool endResponse) that passes false for the endResponse parameter to suppress the internal call to Response.End. For example:
Response.Redirect ("nextpage.aspx", false);
If you use this workaround, the code that follows Response.Redirect is executed.
•For Server.Transfer, use the Server.Execute method instead.
來源
•For Response.Redirect, use an overload, Response.Redirect(String url, bool endResponse) that passes false for the endResponse parameter to suppress the internal call to Response.End. For example:
Response.Redirect ("nextpage.aspx", false);
If you use this workaround, the code that follows Response.Redirect is executed.
•For Server.Transfer, use the Server.Execute method instead.
來源
2012年5月29日 星期二
clickonce 應用程式無法正常安裝或執行
rundll32 %windir%\system32\dfshim.dll CleanOnlineAppCache
刪除此資料夾底下所有資料 %LocalAppData%\Apps\2.0
刪除此資料夾底下所有資料 %LocalAppData%\Apps\2.0
2012年4月26日 星期四
解決 textbox autopostback=true 造成 focus 跑掉的問題
答案在此
簡單 hardcode 版本 : Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () {$('#" + box.ClientID + "').focus();});
簡單 hardcode 版本 : Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () {$('#" + box.ClientID + "').focus();});
2012年1月3日 星期二
固定ListView頂端列
1.移除 aspx 一列
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2.用 div 包住 listview
<div style="overflow: auto; height:400px">
3.LayoutTemplate 第一個 tr 設定 style
<tr style="position:relative;top: expression(offsetParent.scrollTop); " >
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2.用 div 包住 listview
<div style="overflow: auto; height:400px">
3.LayoutTemplate 第一個 tr 設定 style
<tr style="position:relative;top: expression(offsetParent.scrollTop); " >
訂閱:
文章 (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...