最近這段時間寫個系統,一些可以記錄下來的東西整理(2)

2010-06-07

<p>原來預計是想上一篇就把它寫完的(應該是審視一下程式碼以後,發現重複的地方太高了),不過感覺還是有點長(賺篇幅),就在這一篇繼續把它寫完吧。</p>

<p>6. 字串與時間的處理:最常用到的應該是DateTime.Parse(),不過大家都知道,不要想預期的字串一定會進來(笑),然後就會System.ArgumenException摟。在不想做try-catch的方式下,其實還有很多method可以選擇:DateTime.ParseExact(),這個可以handle沒法轉換的情況,DateTime.TryParseExact()除了有ParseExact()的錯誤處理以外,還可以回傳是否轉換成功,這對於塞資料庫時使用參數傳遞的方式,當轉換錯誤時會有參數錯誤的情形,可以有個解套。</p>

1
2
3
4
5
6
IFormatProvider ifp = new CultureInfo("zh-TW", true);
...
if (DateTime..TryParseExact(CR.ConfirmResults[0].AuthDate, "yyyyMMddHHmmss", ifp, DateTimeStyles.None, out AuthDate))
sqlcmd.Parameters.AddWithValue("ConfirmDate", AuthDate);
else
sqlcmd.Parameters.AddWithValue("ConfirmDate", DBNull.Value);

<p>7. ASP.Net AJAX Enabled的網頁要做Server-Side Javascript:當在使用ASP.Net AJAX Framework到網頁上,有許多好用的控制項。但是有時候還是想要使用自定的Javascript(如window.open()),可能會使用到Response.Write()送出Server-Side Javascript,會發生下面的錯誤。</p>

<p><img height=”122” width=”739” src=”http://e.blog.xuite.net/e/2/3/2/11844378/blog_1638788/txt/34736652/5.png" border=”0” /><br />可以看到大概的意思,不能呼叫類似改變輸出的method。找了一下網路,發現到有解決的<a target=”_blank” href=”http://yaneshtyagi.blogspot.com/2007/10/redirecting-to-new-window-in-c.html">Solution</a>,相關程式碼如下。&nbsp;</p>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public static class ResponseHelper {

public static void Redirect(string url, string target, string windowFeatures)

{

HttpContext context = HttpContext.Current;

if ((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) &amp;amp;&amp;amp; String.IsNullOrEmpty(windowFeatures))

{

context.Response.Redirect(url);

}

else

{

Page page = (Page)context.Handler;

if (page == null)

{

throw new InvalidOperationException("Cannot redirect to new window outside Page context.");

}

url = page.ResolveClientUrl(url);

string script;

if (!String.IsNullOrEmpty(windowFeatures))

{

script = @"window.open(""{0}"", ""{1}"", ""{2}"");";

}

else

{

script = @"window.open(""{0}"", ""{1}"");";

}

script = String.Format(script, url, target, windowFeatures);

ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true);

}

}

}

<p>所以只要呼叫ResponseHelper.Redirect()就能夠跳出新視窗了。</p>

1
ResponseHelper.Redirect("./HTMLPage.htm?STK=" + ret,"_blank", "height=600, width=800, resizable=no, toolbar=no, menubar=no, scrollbars=yes, location=no, status=no");

<p>8. 讓有MasterPage的網頁暫時不要有MasterPage:其實這算Dirty Hacking啦,就是根據一定的需求,去改Page.MasterPageFile,做一個是空的MasterPage,動態指定即可。要記得指定MasterPageFile要在Page_PreInit()裡改變,要不然會有錯誤喔。</p>

1
2
3
4
5
6
7
8
9
10
11
12
13
protected void Page_PreInit(object sender, EventArgs e)

{

if (Request.QueryString["CompanyID"] != null || Request.QueryString["ROCID"] != null)

{

Page.MasterPageFile = "~/PaymentMasterPage2.master";

}

}

<p>9. 做可以讓GridView的CheckBox全選的方法:這個東西網路上很多,就是要在原GridView設TemplateField,並且把相關的CheckBox放上去。</p>

<p><img height=”256” width=”797” src=”http://e.blog.xuite.net/e/2/3/2/11844378/blog_1638788/txt/34736652/6.png" border=”0” /></p>

<p>接下來是SelectAllCheckboxes(),寫在網頁的最下方。</p>

<pre class=”brush: jscript;”>function SelectAllCheckboxes(spanChk) {

elm = document.forms[0];

for (i = 0; i &lt; elm.length; i++) {

if (elm[i].type == “checkbox” &amp;&amp; elm[i].id != spanChk.id) {

if (elm.elements[i].checked != spanChk.checked)

elm.elements[i].click();

}

}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

&lt;p&gt;Server-Side就可以透過FindControl()來找是不是有被勾選了(當然全選一定會被勾)。&lt;/p&gt;

```cs
foreach (GridViewRow gvr in GridView1.Rows)

{

chkb = (CheckBox)gvr.FindControl("CheckBox1");

if (chkb.Checked)

{

...

}

}

<p>10. 避掉存取其他Web Services時憑證的錯誤:這個的問題是,要存取某些Web Services,但是該Services的IIS憑證是錯的,如果直接用的話,會發生錯誤。當然最好的方法是申請與安裝新的憑證,但是有時候太急的話可能要先處理一下。網路上找呀找,發現我之前就有找過類似的<a target=”_blank” href=”http://blog.xuite.net/retsamsu/diary/29392339">問題</a>了,不過還是分享一下C#的方式。</p>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static bool ValidateServerCertificate(

object sender,

X509Certificate certificate,

X509Chain chain,

SslPolicyErrors sslPolicyErrors)

{

return true;

}

...

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

MTPGNS = new MTNetPGWS.MTNet小額支付平台WebServices();

...

<p>待續…</p>


Blog comments powered by Disqus