2010年8月20日 星期五

System.Lazy 介紹 - .NET Framework 4 c# 新功能

System.Lazy為.NET Framework 4 c#新增的功能,主要可讓我們在程式中延遲產生執行個體(instance)。有些應用中,我們並不需要在宣告的時候就真的產生一個執行個體,可在真的要用到時,再透過執行與取得Lazy類別的屬性Value實際去產生一個執行個體,這樣可用再需節省寶貴的系統資源上,如須事先大量反覆且複雜運算或是存取資料庫的時候。


擷自網站: www.space.com NASA 最新機器太空人Robonauts2


一個範例


假設有一個Robot(機器人)類別,該機器人有兩個主要功用:

1.整理花園(Garden Assistant):不需耗費大量機器人資源。
2.建造房屋(Building Creater):需耗費大量機器人資源且須投入現金方可建造房屋完成。


我們先建立「花園」與「房屋」的類別如下:



public class Garden
{
    private string _msg = "Robot build a garden!";
    public string Create()
    {
        return _msg;
    }
}


public class House
{
    private string _msg = "Robot build a house!";
    public House(int cost)
    {
        _msg += " It's cost is NT$" + cost;
    }
 
    public string Create()
    {
        return _msg;
    }
}


實作將System.Lazy封裝到類別中


接著我們也建立Robot類別,這個類別可透過呼叫Create()這個方法來完成「整理花園」或是「建造房屋」這兩項機器人所提供的功用。並且可傳遞一個檢驗訊號(Msg這個屬性),這個檢驗訊號用來判斷目前使用Lazy類別的instance是否已經被建立了。


public class Robot
{
    private Lazy<House> _house;
    private Garden _garden;
    private string _msg;
 
    public Robot()
    {
        _house = new Lazy<House>(() => new House(99000));
        _garden = new Garden();
    }
 
    public Garden CleanGarden
    {
        get { return _garden; }
    }
 
    public House BuildHouse
    {
        get { return _house.Value; }//這裡才真的建立instance
    }
 
    public string Msg
    {
        get
        {
            if (_house.IsValueCreated)
                _msg = "The instance of house"
                +"has been created!";
            else
                _msg = "The instance of house"
                +"not be created!";
                return _msg;
        }
    }
}


我們建立Robot類別的執行個體時(instance)時,因為尚不需要機器人實際去「建造房屋」,因為「建造房屋」所費不貲,請須耗費機器人大量的時間與資源,也可能減損機器人的壽命,所以我們為「建造房屋」加上Lazy的類別,一直等到我們實際要「建造房屋」,就去執行Lazy類別中的屬性Value,系統會真正將Lazy這個instance建立起來,然後我們可以利用此instance去呼叫「房屋」類別的的Create()這個方法來建立房屋。


我們也可以帶入「建屋成本」這項整數型態的參數到房屋類別中,如上述程式的$99,000。而「整理花園」這建機器人的工作,就不需耗費機器人大量的時間與資源,故我們直接使用一般建立執行個體(instance)的方式來(new SomeClass())讓機器人可完成「整理花園」這項輕鬆的工作。


執行結果


前端介面如下兩個圖示,使用者按下按鈕下達命令要機器人去「整理花園」或「建造房屋」,然後並且顯示出一段機器人執行狀況(藍字),與顯示出檢驗訊號字串(紅字)。

按下「整理花園」按鈕時的顯示畫面,由紅色檢驗訊號字串可看出我們雖然已經使用了new Lazy<House>這對程式建立了house,但系統尚未真的建立instance。



按下「建造房屋」按鈕時的顯示畫面,由紅色檢驗訊號字串可看出此時系統真的去建立instance,並用此instance來執行「建造房屋」。



當然我們可以使用自行定義的類別與其中的方法也可以達到延遲產生執行個體(instance)的功能,但微軟在.NET Framework 4中推出System.Lazy,就是希望開發者可以直接使用,優點是有一致的意外處理(Exception)介面可使用,且符合執行緒的安全性考量。


相關聯結


Lazy<T> 類別-MSDN

http://msdn.microsoft.com/zh-tw/library/dd642331.aspx

延遲初始設定-MSDN

http://msdn.microsoft.com/zh-tw/library/dd997286.aspx

HOW TO:執行物件的延遲初始化-MSDN

http://msdn.microsoft.com/zh-tw/library/dd460709.aspx

LazyList<T> vs System.Lazy<List<T>> in ASP.NET MVC 2 stackoverflow

http://stackoverflow.com/questions/2689986/lazylistt-vs-system-lazylistt-in-asp-net-mvc-2

Lazy initialization in .NET 4 – Lazy<T>

http://reedcopsey.com/2009/10/26/lazy-initialization-in-net-4-lazyt/

Getting Lazy with System.Lazy

http://devlicio.us/blogs/derik_whittaker/archive/2010/05/19/getting-lazy-with-system-lazy.aspx

文章分類: C#

2010-10-4 星期一

使用DateTime.TryPase()驗證欄位值是否為日期格式

當我們在作資料欄位型態檢查時,遇上要檢查日期欄位的資料型態,總是會一時愣在那邊,心想是否要寫一大段判斷年月日等等是否符合規則的程式語法,期時不需要,我們可以利用TryPase()的方式,快速與簡單的判斷某個使用者輸入是否符合日期格式。假設我們要驗證名稱為txtDateStart的字串是否輸入值服何日期格式....MORE


2010-08-20 星期五

System.Lazy 介紹 - .NET Framework 4 c# 新的功能

System.Lazy為.NET Framework 4 c#的新增加的功能,主要可讓我們在程式中延遲產生執行個體(instance).有些應用中,我們並不需要在宣告的時候就真的產生一個執行個體,可以在真的要用到的時候,再透過執行與取得Lazy類別中的屬性Value實際去產生一個執行個體,這樣可用再需節省寶貴的系統資源上,如須事先大量反覆且複雜運算或是存取資料庫的時候....MORE

2010年8月16日 星期一

Steve The Cat (史蒂夫貓)參加美國太空總署(NASA)-鳳凰號火星探測任務(Phoneix Mars Mission)

人類的另外一個好朋友-史蒂夫貓咪,參加美國太空總署(NASA)-鳳凰號火星探測任務(Phoneix Mars Mission)全程記錄部落格。


擷自網站:SteveTheCat.com


而鳳凰號火星探測任務是NASA的火星登陸計畫之一,鳳凰號太空探測船於2008/5/25成功登陸在火星北極。下圖為史蒂夫貓與火箭升空時和太空管制中心人員聯繫之畫面:


擷自網站:SteveTheCat.com


史蒂夫貓在太空中回覆太空管制中心人員之畫面:


擷自網站:SteveTheCat.com


史蒂夫貓先前接受太空訓練之畫面:


擷自網站:SteveTheCat.com



相關聯結:

史蒂夫貓
史蒂夫貓火星任務
美國太空總署(NASA)-鳳凰號火星探測任務(Phoneix Mars Mission)

2010年8月15日 星期日

Buckethead 現場演奏功力一流的吉他手

開頭有雙截棍表演,很特別!

Guns N' Roses - Buckethead Solo (Rock In Rio 2001)


Buckethead Solo (awesome)


Buckethead and Praxis - Interworld and The New Innocence


Buckethead - Jordan (Live)


Guns N' Roses也有在演唱會中,請他一起演奏過

Buckethead - November Rain Solo - Glowing eyes


Buckethead Lesson (Edited Version)

2010年8月14日 星期六

Hong Kong Design Part II -September 2009 香港澳門街頭廣告設計

透明的設計配上溫暖的燈光,吸引飢腸轆轆的旅人駐足。(時代廣場附近地鐵的麵包店)

雖然很少有車子會漆成綠色,尤其在東方國家,啊就是會很恐怖的樣子,不過這裡四週的霓虹燈五顏六色,因該不會有這種感覺。(太平山頂廣場)

SWATCH...我喜歡的牌子,每季有不同的訴求,但不脫年青與時尚,配上綺麗繽紛的色彩與豐富想像力的廣告版面設計。(澳門威尼斯旅人酒店)

很大的地方,走累了時,你會希望看到這家店,店內裝潢也配合酒店內設計。(澳門威尼斯旅人酒店)

沒有燈光相挺,廣告本身的色彩就足以吸引目光。(澳門威尼斯旅人酒店)

亮片式的廣告,有時也很有效果。(九龍車站)

讓女生感覺..嘿..我是皮箱,但是我不重,也是取輕盈通透的顏色搭配。

很香港的廣告,沒辦法,維港太有名了,不過西餐應該不會讓外國人士認為是香港令人回味的食物。(太平山頂)

小甜點店,有點酸酸甜甜青澀的顏色搭配,應該就是想賣這種感覺給客人。(荃灣)

全彩武俠漫畫也是香港出產的名產之一,看到超大真實公仔,動漫迷一定會衝過去照張相的。(荃灣)

文章分類:Hong Kong


2010-08-14 星期六

Hong Kong Design Part I - September 2009 香港城市景觀設計

前些日子去了趟香港,在街頭四處遊竄,東照照西看看。

有點咪咪貓貓的太空梭模型,但模型本身配色與現場燈光,還是讓人眼光會瞄到這台太空梭。(半島酒店前的太空館)內....MORE


2010-08-14 星期六

Hong Kong Design Part II -September 2009 香港澳門街頭廣告設計

透明的設計配上溫暖的燈光,吸引飢腸轆轆的旅人駐足。(時代廣場附近地鐵的麵包店)

雖然很少有車子會漆成綠色,尤其在東方國家,啊就是會很恐怖的樣子,不過這裡四週的霓虹燈五顏六色,因該不會有這種感覺。(太平山頂廣場)....MORE

Hong Kong Design Part I - September 2009 香港城市景觀設計

前些日子去了趟香港,在街頭四處遊竄,東照照西看看。

有點咪咪貓貓的太空梭模型,但模型本身配色與現場燈光,還是讓人眼光會瞄到這台太空梭。(半島酒店前的太空館)

顏色算是大膽,感覺很像樣品屋,也很少看到願意變成鮮藍色鐵皮的自動販賣機,但放在暖木色的裝潢中,還算OK。(香港賽馬博物館Lobby)

東亞運的吉祥物,很輕盈的設計感覺,有別於身上批批掛掛,顏色鮮豔的運動大會代言動物。(赤柱廣場)

其實這台車後方上面我印像中有廣告看板,那大家就知道這台很亮眼的重機放在這裡有何作用了。不管如何,由男人潛意識出發,還是會多看一眼的。(赤柱廣場)

這張我承認是我照得不好,其實他又黑又亮,複雜的機械內裝設計讓人有如置身高科技電影之中的氛圍。(香港科學館)

黑色環繞著不銹鋼金屬的設計,是否讓人比較對這裡有穩重的高科技感。(九龍車站)

世界性大都市不可或缺的元素,精品店、高聳入雲的建築物、壅擠街頭上的各國人士。(中環)

白色建築+玻璃帷幕的外觀,讓人比較更願意親近,尤其在摩天大樓環立的維港。(香港島維多利亞港 IFC II)

陡峭的建築物街景,讓人步伐不由得加快,港島比較新的商用建築物很多配上深色玻璃的大樓。(港島跑馬地)

使用c#讓登入使用者進行Active Directory 網域身分認證

本文介紹如何用c#程式對Active Directory網域進行身分認證。
首先我們先取得AD認證server的資訊,我們將這資訊寫在Web.Config的<appSettings>內。

//web.config
<appSettings>
    <!--AD Server Information-->
    <add key="ADServer" value="192.168.31.48:389"/>


在程式開頭,需引用System.DirectoryServices這個類別。

using System;
using System.Configuration;
using System.DirectoryServices;

接著,我們寫一個方法來承接使用者登入時輸入的帳號與密碼,首先我們取得web.config中的AD 認證server資訊,然後建立一個DirectoryEntry的物件,將AD 認證server資訊+user帳號+user密碼帶入,再來設定search.Filter搜尋條件為cn=user帳號,然後使用search.FindOne()去找尋這個使用者,若search.FindOne()找到但密碼錯誤,則會回應null出來;反之,表示我們找到也對這個登入者認證成功。

private bool IsValidationForAD(string Username, string Password)
{
    string LoginAD =ConfigurationSettings.AppSettings["ADServer"];
    DirectoryEntry entry =
        new DirectoryEntry("LDAP://" + LoginAD, Username, Password);
    object obj = entry.NativeObject;
    DirectorySearcher search = new DirectorySearcher(entry);
    search.Filter = "(&(cn=" + Username + "))";
    SearchResult result = search.FindOne();
    if (result!=null)
    {
        return true;//verify password is succeed!
    }
    else
    {
        return false;//User ID or Password Error!!
    }
}

文章分類:Active Directory


2010-08-14 星期六

使用c#讓登入使用者進行Active Directory 網域身分認證

本文介紹如何用c#程式對Active Directory網域進行身分認證。
首先我們先取得AD認證server的資訊,我們將這資訊寫在Web.Config的<appSettings>內....MORE

2010年8月13日 星期五

NASA 鳳凰號火星探測船 - Phoneix Mars Mission

介紹這個任務主要是想分享探索另外一個世界所帶來的震撼,與畫家畫出的具有美感與設計感的想像圖。

鳳凰號火星探測船是美國太空總署火星探索計畫於2008年5月25日成功登陸火星北極,為人類第一個成功登陸火星北極的探測船。探測船本身擁有氣象分析儀器,攝影照像設備,比較特別的還有溝槽挖掘機器手臂,還有一個裝有DVD 碟片的時間囊,待未來人類登入後可獲知我們這個世代對火星的各種臆測與想像。


擷自:美國太空總署NASA鳳凰號火星任務官網



下圖示描述鳳凰號火星探測船任務,與該船的各種設備,畫家用一張圖就傳達了完整的探測任務與裝備訊息,給畫家5個讚!

擷自網站:Mrs.Hyland's Cool Science Page


下圖示鳳凰號火星探測船的Logo,與瀏覽器FireFox的Logo擁有相同色系與設計感。


擷自:美國太空總署NASA鳳凰號火星任務官網


亞利桑那大學鳳凰號火星探測船彩繪紀念牆。

擷自:美國太空總署NASA鳳凰號火星任務官網


下圖表示畫家想像鳳凰號火星探測船登陸火星時畫面,其實看官網描述,這個登陸火星的短短幾分鐘,對鳳凰號火星探測船來說,等於是從鬼門關走一回,因為一不小心,就會撞毀在火星地表上,而無法執行她的任務。


擷自:美國太空總署NASA鳳凰號火星任務官網



鳳凰號火星探測船登錄後,也陸續傳回珍貴的火星地表照片,更重要與讓人興奮的,是傳回與探測到火星有冰存在如下圖,可注意看左右兩圖左下角陰影部份,左邊是2008/07/15照下來的,有白色固體存在,但是到了2008/07/19右圖顯示過了四天,在同一個陰影部份位置,這些土表淺層的白色固體已經不見了,經過NASA的分析,這幾乎確定是類似"水被蒸發"的過程。


擷自:美國太空總署NASA鳳凰號火星任務官網


目前鳳凰號火星探測船已經無法傳回訊息回地球,目前有衛星照片顯示,可能是太陽能蓄電面板損壞,導致功能無法運作。由2010/05/24下圖右邊看來,目前有一邊的太陽能面板無陰影存在,可能已經損壞了,也因為該探測船並不是設計在極地氣候中長期運作,故也有可能遭受到火星北極的氣候的侵襲而毀損部分功能。

擷自:美國太空總署NASA鳳凰號火星任務官網



整個感覺地球目前派出去的太空探測船,都帶著告別家鄉父老,開拓邊疆,至死方休的悲壯使命感出擊,就算已經知道自己最後終將無法回家需老死異鄉的命運,也還為達成任務而盡全力燃燒自己生命也在所不惜。她們的精神真偉大,向這些太空探測船們至上最高敬意。(「航海家一號」(Voyager 1):用子彈射擊出去20倍的速度已經飛了33年了,目前快飛出太陽系了)


相關聯結:


亞利桑那大學鳳凰號火星探測船
美國太空總署NASA鳳凰號火星任務官網
維基百科鳳凰號火星探測器
史蒂夫貓上火星
Mrs. Hyland's Cool Science Page

文章分類:火星任務 Mars Mission


2010-08-16 星期一

史蒂夫貓參加美國太空總署(NASA)-鳳凰號火星探測任務(Phoneix Mars Mission)

人類的另外一個好朋友-史蒂夫貓咪,參加美國太空總署(NASA)-鳳凰號火星探測任務(Phoneix Mars Mission)全程記錄部落格。。....MORE


2010-08-14 星期六

鳳凰號火星探測任務-Phoneix Mars Mission

鳳凰號火星探測船是美國太空總署火星探索計畫於2008年5月25日成功登陸火星北極,為人類第一個成功登陸火星北極的探測船。探測船本身擁有氣象分析儀器,攝影照像設備,比較特別的還有溝槽挖掘機器手臂,還有一個裝有DVD 碟片的時間囊,待未來人類登入後可獲知我們這個世代對火星的各種臆測與想像。....MORE


2010年8月11日 星期三

Seal - kiss from a rose live 2004 蝙蝠俠 黑暗騎士 電影主題曲

Seal - Kiss from a rose LIVE 2004

文章分類:Music


2010-08-15 星期日

Buckethead 現場演奏功力一流的吉他手

特殊的造型,現場演奏電吉他功力一流,Gun's N Rose也有邀請他一塊参加演唱會表演....MORE



2010-08-12 星期四

很棒的 DJ + 很棒的音樂 -- >> Dj Craze 20100725

戶外DJ飆音樂....MORE



2010-08-12 星期四

Seal - kiss from a rose live 2004 蝙蝠俠 黑暗騎士 電影主題曲

爵士,有點藍調,勾起心靈深處的往事,主要是Seal唱得很棒啦
....MORE

很棒的 DJ + 很棒的音樂 -- >> Dj Craze 20100725

213* Dj Craze!! Flashback! @ the Do Over 7/25/10

2010年8月10日 星期二

在Entity Framework應用中善用ICollection介面中的判斷方法Any()

我們使用ADO.NET Entity Framework 等ORM(Object Relation Model)的方式自資料庫中存取資料時,常會遇到若存取結果是有資料時,我們要進行一些A處理,而沒有任何資料時,我們則進行B處理,我們可以,但最好不要使用直接使用ICollection介面中的count()方法來進行是否有回傳任何資料項目的判斷,因為有可能自資料庫中存取資料回傳的不是符合ICollection或者是List等序列型態的資料集合,另外也有可能是傳回Null,所以,我們可以使用ICollection介面中的Any()這個方法來判斷有回傳任何項目。





如下範例,若自資料庫查詢到有一些論壇(Forum)資料存在,則此時Any() = true,則我們可進行A處理(如近一步過濾查詢出來的資料或記錄存取資料等等);若查詢出沒有包含任何資料時,我們可進行B處理(如下範例讓forumAreas=null並回傳出去)。

TOYEntities _contx = new TOYEntities();
public List<ForumArea> SelectAll()
{
    var forumAreas = (from m in _contx.ForumAreas
        select m).ToList();
    if (forumAreas.Any())
    {
        //do A process
    }
    else
    {
        //do B process
        forumAreas = null;
    }
    return forumAreas;
}

我們就用Any()去判斷資料項目的有無,可以避免與掌控很多網站程式動態執行時的例外狀況,增加程式的穩定性。

2010年8月9日 星期一

文章分類:Html Helper


2010-08-10 星期一

Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial的基本運作與介紹

在使用MVC的方式建立網站應用程式中,我們可以使用一些Html Helper來幫助我們產生精簡的字串型態HTML碼(如Form表單、項目列表或是連結),並放置在View當中,這裡我們介紹Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial等4種Html Helper使用方式。...MORE



2010-08-10 星期一

Html.Partial與Html.RenderPartial使用方式

這兩個Html Helper屬於System.Web.Mvc.Html.PartialExtensions類別下的方法之一,使用方式都是將PartialView名稱,Model或ViewData當作參數帶入這些Html Helper,而這個當作參數帶入的PartialView名稱,通常就是我們可以先製作成為User Control View (*.ascx),另外亦可進一步將Model或者是ViewData帶入這個預先製作好的User Control View 中。...MORE



2010-08-10 星期一

Html.Action與Html.RenderAction使用方式

這兩個Html Helper屬於System.Web.Mvc.Html.ChildActionExtensions類別下的方法之一,使用方式都是將Action名稱,Controller名稱或route value當作參數帶入這些Html Helper,執行完Action後,通常會再將其執行後的結果傳遞到某個預先製作好的user control view (*.ascx),然後在主要的View上顯示這段字串型態HTML碼。...MORE



2010-07-16 星期五

如何設定HtmlHelper.GenerateRouteLink、routeName、routeValues與HtmlAttributes

HtmlHelper是MVC中新的而且很好用的物件,我們可以用來產生很多延伸的各種Helpers,其中HtmlHelper.GenerateRouteLink()可以用來產生網頁上很單純Link的HTML碼。


<a href="http://myWebSite/Product/Browse" >產品瀏覽</a>


而本文就是利用HtmlHelper.GenerateRouteLink來達到上述產生Link需求,也藉此說明HtmlHelper.GenerateRouteLink()的使用方式。...MORE

Html.Action與Html.RenderAction使用方式

在MVC應用中,我們可以使用一些Html Helper來幫助我們建立一些小小可重複使用的Partial View(如Form表單、項目列表或是連結),執行後可內嵌在主要的View之中,本文介紹Html.Action與Html.RenderAction的基本運作與使用方式。


這兩個Html Helper屬於System.Web.Mvc.Html.ChildActionExtensions類別下的方法之一,使用方式都是將Action名稱,Controller名稱或route value當作參數帶入這些Html Helper,執行完Action後,通常會再將其執行後的結果傳遞到某個預先製作好的user control view (*.ascx),然後在主要的View上顯示這段字串型態HTML碼。這個user control view如同上述,可放入與主要View的相同目錄中,也可以放入到View/Shared/這個公用的View目錄中。


Html.Action


這裡我們要產生一個「Menu」在一個主要的View上面,我們在主要的View上要顯示這個Menu的地方標示如下,執行時,會先讀取MenuController內的ShowMenu這個Action。請注意,因為Html.Action的回應示字串型態的Html碼,故須加上Encode的「<%:」符號。

<%: Html.Action("ShowMenu", "Menu") %>

接著,透過ShowMenu這個Action將menu的相關資料取出,然後將這些結果拋給MainMenuUserControl.ascx這個user controle view。


[ChildActionOnly]
public ActionResult ShowMenu()
{
    var menuToList = GetMyMenu();
    return PartialView("MainMenuUserControl", menuToList);
}

MainMenuUserControl.ascx這個user control view接到Menu資料後,產生字串型態menu HTML碼,並回應給主要的View。


<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc2ActionAndRenderAction.Models.MenuViewModel>" %>
<ul id="menu">
<% foreach (var item in Model.Menu) {%>
<li><a href="<%: item.MenuLink %>"><%: item.MenuItem %></a></li>
<%} %>
</ul>


這個範例最後,我們可在下圖看到執行後,可產生如紅框的Menu清單,這裡我們顯示以頁籤方式呈現的menu。





Html.RenderAction


這裡我們要產生一個「購物車+已經挑選多少產品」的連結這個範例在主要的View上,我們在主要的View上標示如下:


<% Html.RenderAction("CartAmount", "ShoppingCart"); %>


執行時,會先讀取ShoppingCartController內的CartAmount這個Action,這裡我們示範將ViewData當作是執行結果拋給CartAmountUserControl.ascx這個user control view。


[ChildActionOnly]
public ActionResult CartAmount()
{
    ViewData["CartCount"] = "8";
    return PartialView("CartAmountUserControl");
}


由CartAmountUserControl.ascx這個user control view回應給主要的View


<%@ Control Language="C#"Inherits="System.Web.Mvc.ViewUserControl" %>
<%: Html.ActionLink( "購物車 (" + ViewData["CartCount"] + ")", "Cart", "ShoppingCart",null)%>


最後回應到主要的View呈現如下紅框的「購物車+已經挑選多少產品」。這樣也可以將這個Html Helper內嵌在需要的網頁上,而不用每次都重寫一次相同的處理邏輯。





上面即是Html.Action與Html.RenderAction的範例說明.與本文相關的連結如下:

Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial的基本運作與介紹
Html.Partial與Html.RenderPartial使用方式

Html.Partial與Html.RenderPartial使用方式

在MVC應用中,我們可以使用一些Html Helper來幫助我們建立一些小小可重複使用的Partial View(如Form表單、項目列表或是連結),執行後,可內嵌在主要的View之中,本文介紹Html.Partial與Html.RenderPartial的基本運作與使用方式。


這兩個Html Helper屬於System.Web.Mvc.Html.PartialExtensions類別下的方法之一,使用方式都是將PartialView名稱,Model或ViewData當作參數帶入這些Html Helper,而這個當作參數帶入的PartialView名稱,通常就是我們可以先製作成為User Control View (*.ascx),另外,亦可進一步將Model或者是ViewData帶入這個預先製作好的User Control View 中,這個User Control View可放入與主要View的相同目錄中,也可以放入到View/Shared/這個公用的View目錄中。


Html.Partial


這裡我們要產生一個類似「Navigation Bar(網頁導覽連結)」的功能在一個主要的View上面,我們首先在主要的View上在要顯示這個Bar的地方標示如下,表示我們要取用的內容在名稱為NavigateBarUserControl.ascx的這個User control View。請注意,因為Html.Partial的回應示字串型態的Html碼,故須加上Encode的「<%:」符號。


<%: Html.Partial("NavigateBarUserControl") %>

NavigateBarUserControl.ascx的程式內容如下:


<%@ Control Language="C#"
Inherits
="System.Web.Mvc.ViewUserControl" %>
<span style="color:Green;">Home > DemoPage > Product</span>

這個範例執行後,產生的整個主要的View如下圖所示,紅框部分為我們使用Html.Partial所產生的網頁導覽連結。這樣的方式,使得相同的網頁導覽連結這個功能可以在不用重寫程式的狀況下,讓在網站的不同地方被使用。



另外,若要帶入Model(假設是NavigateViewModel)當作是參數到Html.Partial中,可採下列方式寫法:


<%: Html.Partial("NavigateBarUserControl",Model) %>


當然NavigateBarUserControl.ascx中也要註明是要去接Model(假設是NavigateViewModel) 這個參數。


<%@ Control Language="C#"
Inherits
="System.Web.Mvc.ViewUserControl<Mvc2Application.Models.NavigateViewModel>" %>
<% foreach (var item in Model) {%>
    :
    :


已上為Html.Partial的用法。


Html.RenderPartial


這裡的範例,是想要呈現「登入使用者的角色」到主要的View網頁上,我們順道示範如何將ViewData也帶入到Html.RenderPartial之中,我們要呈現的PartialView是一個名稱為RolesUserControl.ascx的User control View,為了簡化範例我們令ViewData等於一個Admin的角色名稱。


<% Html.RenderPartial("RolesUserControl", ViewData["Role"] = "Admin"); %>

RolesUserControl.ascx的程式內容如下,ViewData的名稱須與上述帶入的ViewData參數同名:


<%@ Control Language="C#"Inherits="System.Web.Mvc.ViewUserControl" %>
<span>Role:<%:ViewData["Role"] %></span>


執行這個範例後,如下圖會在主要的View頁面上顯示這個PartialView,當然一般這個網頁導覽連結會設定在MVC應用中的Site.Master這支View之中。




上面即是Html.Partial與Html.RenderPartial的範例說明,陸續我們會介紹Html.Action與Html.RenderAction使用方式,與本文相關的連結如下:

Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial的基本運作與介紹

Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial的基本運作與介紹

在使用MVC的方式建立網站應用程式中,我們可以使用一些Html Helper來幫助我們產生精簡的字串型態HTML碼(如Form表單、項目列表或是連結),並放置在View當中,這裡我們介紹Html.Action、Html.Partial、Html.RenderAction與Html.RenderPartial等4種Html Helper使用方式。


應用時機


我們需要在一個主要的View中之部分去呈現另外一個小小的View(以下稱為Partial View),如購物車資訊、登入者資訊、會員維護表單...等等。透過呼叫這些小小的Partial View,我們可以獲得一些HTML碼(如Form表單、項目列表或是一些連結),在MVC中若有上述的需求,我們可以透過到這4個Html Helper來產生與完成這項需求。


運作方式


通常我們透過這些內嵌在View中的Html Helper直接回應一個PartialView,或是去執行一個Controller中的某個Action,並將執行結果(字串型態HTML碼或是產生Partial View)回傳到原來呼叫它們的主要View之上,然後內嵌在這個原來主要的View中,成為這個View的一部份。如下圖:




執行Html.Partial之後傳回字串型態HTML碼,執行Html.RenderPartial後則直接呈現Partial View,然後皆內嵌在這個主要的View中,回應給使用者。




Html.Action與Html.RenderAction皆透過執行另外一個Control與Action。執行Html.Action之後傳回字串型態HTML碼,執行Html.RenderAction後最後會直接呈現Partial View,然後內嵌在這個View中,回應給使用者。




每個Html Helper的回應的型態整理如下圖所示:





這4個Html Helper的詳細介紹與範例,將在陸續的文章中說明,與本文相關的連結如下:

Html.Action與Html.RenderAction使用方式
Html.Partial與Html.RenderPartial使用方式
透過呼叫多個動作建立 ASP.NET MVC 檢視
System.Web.Mvc.Html.PartialExtensions類別
System.Web.Mvc.Html.ChildActionExtensions類別

2010年8月3日 星期二

如何在Html.TextBoxFor內設定Disable TextBox欄位

在網頁維護資料頁面中,常需有TextBox欄位是給user看,但並不准許user去修改這個欄位,這時我們就需要將這個欄位給「失效」(disable)起來,看起來應該如下圖:




在一般Web Form應用中,我們可用TextBox控制項中的Enabled = "false" 來達成這個要求,但在MVC應用中,因為不採用控制項的方式,故我們需要在Html.TextBoxFor的屬性去標示。假設現在我們有一個TextBox欄位「會員編號」,因為在會員資料維護功能中,我們並不開放這個欄位給user修改,所以須將「會員編號」這個欄位給「失效」(disable)起來,並成只能看不能改的欄位,且整來反灰顯示,我們可以在MVC的View中用下列方式設定:


<%: Html.TextBoxFor(model => model.Order.CustomerID, new { @disabled = "disabled" })%>

這個View實際運作時,如下畫面所示,可達成我們將TextBox欄位「失效」(disable)起來的效果。