星期四, 8月 28, 2008

星期二, 8月 26, 2008

(linq to xml)產生rss 2.0

最近在做這功能..順便把class貼出來..下次有需要用到的人就有範例可以參考了..Tongue out..

using System;
using System.Collections.Generic;
using System.Data;
using System.Xml.Linq;

/// <summary>
/// 產生rss 2.0的class
/// </summary>
public class RssGenerator
{
#region 欄位,預設值
private XNamespace _nameSpace = "http://yourDomain";
private string _language = "zh-tw";
private string _pubDate = DateTime.UtcNow.ToString();
private string _lastBuildDate = DateTime.UtcNow.ToString();
#endregion

#region 屬性,來設定基本的rss描述
List<object> liObj = new List<object>();

public string NameSpace
{
set { _nameSpace = value; }
}
public string Title { private get; set; }
public string Link { private get; set; }
public string Description { private get; set; }
public string Language
{
set { _language = value; }
}
public string PubDate
{
set { _pubDate = value; }
}
public string LastBuildDate
{
set { _lastBuildDate = value; }
}
public string Generator { private get; set; }
public string ManagingEditor { private get; set; }
public string WebMaster { private get; set; }
#endregion

/// <summary>
/// 新增rss
/// </summary>
/// <param name="dt">丟入內容datatable,ColumName要用MyRssTagName</param>
/// <returns>丟回rss的xml</returns>
public string Create(DataTable dt)
{
//加入Rss基本描述
RssBaseDescription();
//顯示要出現的內容
ItemsContent(dt);

//產生xml
XDocument xDoc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XProcessingInstruction("rss", "version=\"2.0\""),
//new XComment("這是測試用產生Rss"),
new XElement(_nameSpace + "rss",
new XAttribute("version", "2.0"),
new XElement(_nameSpace + "channel",
liObj.ToArray()
)
)
);

return Convert.ToString(xDoc);
}
/// <summary>
/// 把基本欄位加入
/// </summary>
private void RssBaseDescription()
{
liObj.Add(new XElement(_nameSpace + "title", Title));
liObj.Add(new XElement(_nameSpace + "link", Link));
liObj.Add(new XElement(_nameSpace + "description", Description));
liObj.Add(new XElement(_nameSpace + "language", _language));
liObj.Add(new XElement(_nameSpace + "pubDate", _pubDate));
liObj.Add(new XElement(_nameSpace + "lastBuildDate", _lastBuildDate));
liObj.Add(new XElement(_nameSpace + "generator", Generator));
liObj.Add(new XElement(_nameSpace + "managingEditor", ManagingEditor));
liObj.Add(new XElement(_nameSpace + "webMaster", WebMaster));
}
/// <summary>
/// 要show出rss的內容
/// </summary>
/// <param name="dt"></param>
private void ItemsContent(DataTable dt)
{
foreach (DataRow dr in dt.Rows)
{
liObj.Add(
new XElement(_nameSpace + "items",
new XElement(_nameSpace + "title", Convert.ToString(dr["title"])),
new XElement(_nameSpace + "link", Convert.ToString(dr["link"])),
new XElement(_nameSpace + "description", Convert.ToString(dr["description"])),
new XElement(_nameSpace + "pubDate", Convert.ToString(dr["pubDate"])),
new XElement(_nameSpace + "guid", Convert.ToString(dr["guid"]))
)
);
}
}
/// <summary>
/// rss items的tag
/// </summary>
public enum MyRssTagName
{
title, link, description, pubDate, guid
}
}

使用方法

RssGenerator xml = new RssGenerator();

//rss預設值
xml.NameSpace = "http://bibby.be";
xml.Title = "Rss Test";
xml.Link = "http://bibby.be";
xml.Language = "zh-tw";
xml.Generator = "aa@test.test";
xml.ManagingEditor = "aa@yahoo.com.tw";
xml.PubDate = DateTime.Now.ToString();

//要產生出來的資料
DataTable dt = new DataTable();
dt.Columns.Add(RssGenerator.MyRssTagName.title.ToString());
dt.Columns.Add(RssGenerator.MyRssTagName.link.ToString());
dt.Columns.Add(RssGenerator.MyRssTagName.description.ToString());
dt.Columns.Add(RssGenerator.MyRssTagName.guid.ToString());
dt.Columns.Add(RssGenerator.MyRssTagName.pubDate.ToString());
for (int i = 0; i < 2; i++)
{
DataRow dr = dt.NewRow();
dr[0] = "Title";
dr[1] = "http://yahoo.com.tw";
dr[2] = "just test it";
dr[3] = "idid";
dr[4] = DateTime.Now.ToString();
dt.Rows.Add(dr);
}

//string Rss = xml.Create(dt);
xml.Create(dt)

需要者自行服用..拉肚子..別找我..Vampire BatVampire BatVampire BatVampire BatVampire BatVampire BatVampire Bat..

星期四, 8月 21, 2008

如何知道class在系統中instance幾次

現在記憶體越來越大了..我們常常很習慣的就new一個物件出來..所以沒有啥差別..^^||..那如果我想知道某麼class到底new幾次..那要怎麼知道ㄟ..我寫一個很簡單的方式去查看..看原始碼ㄅ..

public class test1
{
//來紀錄這個instance已經在記憶體中有幾個
private static int numberTestObj = 0;

//建構式
public test1()
{
++numberTestObj;
}

//解構式
~test1()
{
--numberTestObj;
}

//抓出到底有幾個instance
public int getTestObjNumber()
{
return numberTestObj;
}
}

test1 t1 = null;
for (int i = 0; i < 38; i++)
{
t1 = new test1();
}

//列出來
Response.Write(t1.getTestObjNumber());

我這裡是用一個class來代表..其實只要在想測的class加入那靜態欄位..一樣可以算出總和..這只是有趣的測試..Devil..各位看官參考一下ㄅㄅ...Cowboy..


星期三, 8月 20, 2008

Using the scriptmanager control to combine javascript

最近更新完vs2008的sp1..上官方網站看..看到有一個不錯玩的東西..就是script manager可以把網頁的所有javascript合併起來..變成一個整理(壓縮?..檔案有變小)好的javascript..這點真的蠻吸引人的..因為ajax的引入還有jquery的使用..網頁裡一堆javascript..看起來fu就不太對..Hot..

首先我們先去載一個ScriptReferenceProfiler來幫助你把頁面上所有的javascript抓出來..

使用前:

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/js/jquery-1.2.6.js" />
</Scripts>
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<cc2:SliderExtender ID="SliderExtender1" runat="server" TargetControlID="TextBox1">
</cc2:SliderExtender>
<cc1:ScriptReferenceProfiler ID="ScriptReferenceProfiler1" runat="server" />
</div>
</form>

dfd

使用後:

<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<CompositeScript>
<Scripts>
<asp:ScriptReference Name="MicrosoftAjax.js" />
<asp:ScriptReference Name="MicrosoftAjaxWebForms.js" />
<asp:ScriptReference Path="~/js/jquery-1.2.6.js" />
<asp:ScriptReference Name="AjaxControlToolkit.Compat.Timer.Timer.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="AjaxControlToolkit.Common.Common.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="AjaxControlToolkit.Animation.Animations.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="AjaxControlToolkit.Compat.DragDrop.DragDropScripts.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="AjaxControlToolkit.ExtenderBase.BaseScripts.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="AjaxControlToolkit.Slider.SliderBehavior.js"
Assembly="AjaxControlToolkit, Version=3.0.20229.20843, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
</Scripts>
</CompositeScript>
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<cc2:SliderExtender ID="SliderExtender1" runat="server" TargetControlID="TextBox1">
</cc2:SliderExtender>
<cc1:ScriptReferenceProfiler ID="ScriptReferenceProfiler1" runat="server" />
</div>
</form>

ghy

很簡單就把javascript整理起來了..感覺還真不錯..推薦啦..還有記得要vs2008 sp1才行ㄟ..KissKissKissKiss..

ps:這裡有影片..看這比較快..

參考:

星期五, 8月 15, 2008

no silver bullet

昨天去上【從程式勞工邁向高階架構師之路】..果然有從勞通工變成架構師的感覺..哈..我說低只有感覺..如果要實際慢慢向目標邁進..其實還有很長很長的路要走..Tongue out..我把seminar的一些適合提醒自己的句子摘錄下來..

1.哪來的銀子彈
沒有一槍斃命的東西..只有適合的狀況選擇適合的solution..所以"選擇"很重要

2.軟體開發的金三角:時程,功能,資源
這三件東西常常都是綁在一起的..要注意他們彼此的關係..

3.有品質,讓人安心的開發人員才是好的開發人員
不是一味求快..

4.態度決定一切
任何一刻..都要用架構的角度要求自己
養成量好的程式開發習慣
不要做蠢事(你還有家人要陪健康要顧..不要犧牲自己的時間)
越難的問題越早面對

5.基本素養
重視可讀性--a.先寫註解在寫程式b.讓程式碼看起來像文章
不斷做Refactoring--修改→編譯→測試
不斷的測試--讓自己保持在正軌上
探究原理

6.秘訣
態度--a.相信架構的重要性b.不時的身體力行培養出架構的直覺
學習--a.向好的人學習作品b.像對的人學習c.不要忽視基本功

7.把架構設計變成習慣,口號沒意義,抓緊精神

各位信徒..大家一起努力ㄅ..Right Hug..Vampire BatVampire BatVampire Bat..

參考:
電子書
http://msdn.microsoft.com/zh-tw/practices/default(en-us).aspx
http://msdn.microsoft.com/en-us/library/cc467894.aspx
http://msdn.microsoft.com/zh-tw/magazine/cc159273.aspx

星期二, 8月 12, 2008

The query results cannot be enumerated more than once. 錯誤..

今天在用linq去處理store procedure資料時..頁面跳出一個錯誤..

The query results cannot be enumerated more than once.

google一下找了是否也有人跟我遇到相同的問題..原來原因是..是傳回ISingleResult<T>這個問題..Loser..我們先看一段程式碼..

da.linqToSqlDataContext db = new da.linqToSqlDataContext();

//從store procedure抓出來資料
var aaaa = db.StoredProcedure2().Select(a => a);
//把一個欄位的總和抓出來
double sumA = aaaa.Sum(a => Convert.ToDouble(a.a));
//把剛剛處理好的值拿出來跟欄位計算
var testA = aaaa.Select(a => new { test = Convert.ToDouble(a.a) / sumA });
//列出資料
foreach (var a in testA)
{
Response.Write(a + "<br />");
}

這段程式碼..會產生上面那段錯誤..原因就是aaaa被判斷成ISingleResult<T>的型別..而ISingleResult<T>不能被enumerate一次以上..所以就會發生exception..

解決方法就是把ToList()這樣就行了..

var aaaa = db.StoredProcedure2().Select(a => a).ToList();

解決..SleepySleepySleepySleepySleepySleepySleepySleepySleepy...

參考:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2618572&SiteID=1

星期一, 8月 11, 2008

如何用Javascript去使用server的method

這是小鋪上面的問題..我之前也碰到過..因為之前也是想了很久找了很久才解決的..所以..把想法和技巧整理一下..讓大家參考..

其實javascript跟server端的語言本來就是八竿子打不著關西的傢伙..可是卻有需要在某時某刻互相聯絡一下..所以我們可以用到一些小技巧來當他們之間的媒人..讓他們倆可以哥倆好的..互相溝通一下..那媒人是誰..就是..javascript的__doPostBack這個method..我們在.net的html裡常常可以看到這個method..他主要是做postback的工作..然後可以帶入參數進去..讓server端的可以知道是誰在做postback..這是.net很重要的js..我們看一下..

function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}

好..現在進入主題..那怎麼做了..我的方式是用linkbutton去做這媒介..然後把linkbutton的text屬性變成空白(這樣linkbutton就隱形了)..之後在server端寫下linkbutton的click事件..這樣就設定完畢..

所以如果我們要在client端執行server端的程式..我們就把想要在server端執行的程式寫在linkbutton的click事件裡..然後在client端用js去呼叫__doPostBack('LinkButton1','')..我們就可以執行linkbutton的click的事件..直接看原始碼可能比較清楚..

.aspx
<body>
<form id="form1" runat="server">
<div>
<input id="Button1" type="button" value="這是javascript的按鈕" onclick="jsButton();" />
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click"></asp:LinkButton>
</div>
</form>

<script type="text/javascript">
function jsButton()
{
__doPostBack('LinkButton1','');
}
</script>

</body>

.cs
public partial class jsCallServerMethods : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Write("這是server端的程式");
}
}

這樣就可以完成我們需要的效果了..SurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerdSurpriseNerd..