星期二, 6月 29, 2010

ViewModel 也可以是很複雜的型別阿!!

最近在實務方面,有遇到較複雜的需求,在頁面上需要有重複的子母表單,我的想法是想用 MVC 的 ViewModel 的方式丟一個 Collection 到頁面,這個 ViewModel 記載著子母表單的彼此關係,然後在頁面填完表單,可以用 Post 的方式由頁面再傳回 List<ViewModel>,讓我整個過程都用強型別來處理,所以接下來我們就把這個想法實現吧..

我們先建立子母表單的 class,然後用 TestService 這來模擬資料來源..

image

有了個些測試資料,我們開始準備要顯示的頁面,首先我們先新增兩個 UserControl,這兩個 UserControl 都要放在 EditorTemplates 裡喔,EditoirTemplates 這個命名不能亂改阿阿阿..

image

ViewModel.ascx
 
image
ViewModelChild.ascx
 
image
接下來我們要新增View


image


EditTemplate.aspx

image

接下來我們只要加入controller就大功告成了..


image


TestController.cs

image
呼呼,終於把要寫的要加的都用好了,我們來看一下跑出來的結果吧!!


Get 的方式跑出來,沒問題,優..


image 
重點來啦,如果 Post 的方式也可以接回 ViewModel,那就完美啦..


image

讚..都有抓到ㄟ,出運啦,mvc可以讓我用很簡單的方式用實質型別傳遞來處理資料,這對我們在寫程式也會非常便利,善用這種方法來處理資料,就可以不用在處理那些接值塞值得工作了..^^||...


參考:

星期二, 6月 22, 2010

抓取關聯 Table 的資料

最近在玩 Entity Framework 這個不錯的 ORM 技術,學著自己處理一些簡單的增刪查改的動作,發現還真的不錯用,尤其想到以後可以用到不同的資料庫,又可以用相同的處理手法,就覺的是很不錯的投資,不過也有發現一些需要注意的問題,我用個範例來說明一下..

這是簡單的資料表關聯圖..

image

--我想由TableA抓出TableD--

直接下語法,取出資料..

var data = db.TableA;
foreach (var tableA in data)
{
Console.WriteLine("TableA" + tableA.TableName);
foreach (var tableB in tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
Console.WriteLine("*************");
}

它跑出的 SQL Statement

image

上圖可以看出是一個一個迴圈去下SQL Statement,這樣在筆數多的時候,效能可能會非常低落,這種方式只適合在某一個條件下去取出資料,才是比較對的選擇..

我們換另一種方式用 Include 的方式去把它一次載出來..

var data = db.TableA.Include("TableB.TableC.TableD");
foreach (var tableA in data)
{
Console.WriteLine("TableA" + tableA.TableName);
foreach (var tableB in tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
}

這樣一次就下完所有的SQL Statement,把所有的資料都抓出來,效能一定比一筆一筆下好..

image

還有另一種方式也可以一次把資料都抓出來,就是用匿名型別的方法..

var data = db.TableA.Select(a => new
{
tableA = a,
tableB = a.TableB,
tableC = a.TableB.Select(b => b.TableC),
tableD = a.TableB.Select(b => b.TableC.Select(c => c.TableD))
});
foreach (var item in data)
{
Console.WriteLine("TableA" + item.tableA.TableName);
foreach (var tableB in item.tableA.TableB)
{
Console.WriteLine("--TableB--" + tableB.TableName);
foreach (var tableC in tableB.TableC)
{
Console.WriteLine("----TableC----" + tableC.TableName);
foreach (var tableD in tableC.TableD)
{
Console.WriteLine("------" + tableD.TableName + "-------");
}
}
}
Console.WriteLine("*************");
}

下圖的 SQL Statement 是醜了點,也沒有 Include 簡潔有利,但是不失為一個好方法..

image

這幾種抓取資料的方法,提供大家參考一下,有啥問題也可提出來一起討論看看..

星期日, 6月 20, 2010

天外飛來一個鍵盤(FILCO N-Key rollover 青軸黑色機械式鍵盤)

今天騎車下班,遇到一個個好心的人給我塞給我一個鍵盤,說可以給我無限期試用一下,心想一個鍵盤有啥好囂張的,鍵盤不過只是一個鍵盤,能有多誇張,打開一看,好像有點與眾不同,黑黑的,拿起來有點給它沉重,話說沒圖沒真相啦(鄉民都是這樣說的),馬上貼幾張圖給大家聞香一下..

開箱照..黑漆漆的一片..

IMGP5678

靠近一點..奇怪..還是黑黑的..

IMGP5679

斜看一下..還是黑色的..這鍵盤不會是傳說的說無痕鍵盤吧..哇哩勒..還好我會盲打..不然就被裝笑為了..

IMGP5680

買上拿這個鍵盤給它試用一下,切切切切切...好爽快的聲音阿,打起來好像在敲東西一樣,有說不出來的感覺,爽度無限上升,每敲一下鍵盤,就有響亮清脆的聲音,連打錯字心情也很 high,打下去的觸感跟我之前用的Logitech組裝用500塊鍵盤,真的有天殺的不同阿,馬滴..忽然感覺好像上當了,以後口味改不回來怎麼辦..>_<..
馬上 google 一下這鍵盤到底是何方神聖,查查查..找到了..

image

一_一||..果真是高級貨,這隻在 pchome 裡面的是有刻痕的,而我手上這隻還是無痕的說..馬滴..看來我又心動了..暗暗暗暗暗暗..

--------更新-------
經高人提示..應該是下面這個網址..才是此鍵盤的介紹..
http://www.filco.com.tw/product.php?page_id=23&product_id=30

星期一, 6月 07, 2010

(敗家文)TAMRON 17-50mm F2.8

敗家文又來了,話說單眼相機入手已經快一年了,"出來混的..遲早要還",kit 鏡該是功成身退的時候了,尋找下一個大碗又滿意的鏡頭,就成為最近在網路上亂逛的唯一理由,網路晃阿晃逛阿逛,看到了TAMRON 17-50mm F2.8(B005)高貴又不貴的鏡頭,心整個養起來了,四級的防手振加上2.8的恆定光圈,非常適合我這懶得帶閃光燈又想在燈光不足的餐廳拍個好照片的人,在其他人的使用經驗裡又看到這顆鏡頭可以在1/8秒拍出不"穩定"的照片,所以就是它啦,直接帶著小朋友去把它"贖"回家拉..

開箱文..一定要有箱子..XD..好像沒對到焦..

DPP_0003

看一下鏡頭的側面..

DPP_0004

看一下它的大眼睛..

DPP_0005

屁股也給秀一下..美美的..

DPP_0006

伸個懶腰給客官看一下..

DPP_0007

開始小試身手..來一張滑鼠照..

DPP_0009

再來一個小筆筒..

DPP_0010

最後來個賣我鏡頭可愛的店員..(話說我去買鏡頭時這姑娘還在吃晚餐,她的門牙竟然有卡蔬菜葉,害我在那裡裝鎮定..^^||..)

DPP_0001

這幾張給你們大家聞香一下,貼太多會有人眼紅說是勸敗文,這年頭錢難賺,大家先求溫飽再來求"敗"阿..阿門..

星期五, 6月 04, 2010

用 IRouteConstraint 來約束 Route

我們在學MVC的時候,第一部份應該是接觸 Global.asax 這檔案,因為這關係到我們的網址的格式,輸入網址會到哪一個 Controller 哪一個 action 去做哪些事情,所以好好認識 Route 的設定方式是非常重要的,我們今天來練習一下 Route Constraint,這可以來限制網址會不會吃到這一筆 Route,直接開始吧!!

有個需求,需要新增一筆 Route ,他只吃"時間"的參數,格式如下
http://localhost/20101010
http://localhost/20100523


首先我們先寫一個 DateFormatRouteConstraint,這個 Class 要實作 IRouteConstraint

/// <summary>
/// 日期格式驗證
/// </summary>
public class DateFormatConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
string pName = parameterName.ToLower();
if (routeDirection == RouteDirection.IncomingRequest
&& pName == "date")
{
try
{
string v = values[pName].ToString();
//如果參數不等於8就不屬於日期格式
if (v.Length != 8)
return false;
//驗證是否為日期
int year = int.Parse(v.Substring(0, 4));
int MM = int.Parse(v.Substring(4, 2));
int dd = int.Parse(v.Substring(6, 2));
DateTime datetime = new DateTime(year, MM, dd);
return true;
}
catch
{
return false;
}
}
return false;
}
}

我們就可以在 Global.asax 裡面新增一筆 Route 啦

//多加一條有關時間的route
routes.MapRoute(
"DateTimeRule",
"{datetime}",
new { controller = "file", action = "index", date = "" },
new { date = new Models.DateFormatConstraint() }
);

這樣就可以達到我們的需求了,收工!!

參考
http://msdn.microsoft.com/zh-tw/library/system.web.routing.irouteconstraint%28VS.90%29.aspx