2012年12月26日 星期三

ASP.NET MVC 4 開發實戰


ASP.NET MVC 4 開發實戰
作者:黃保翕(Will 保哥)
出版社:悅知
ISBN:9865912201
出版日期:2012-12-20
頁數:512
台幣定價:680



P.26
我們在開發較為複雜的Web應用程式時,實務上經常利用介面(interface)降低類別與類別的耦合性,主要是先設計介面(interface)再實作類別(Class),而在Controller中撰寫程式時,幾乎都是以介面作為跟Model溝通的橋樑。

P.35
以筆者的實務開發經驗來說,我覺得M(Model)是MVC架構的中心,先有Model之後,就可以讓Controller與View參考這些Model(模型),先定義出所有計畫開發的Controller與Action,然後再建立所有Action對應的View(無內容的View),之後就可以將不同單元的Controller與View分工開發,最後再進行整合即可。這是我認為最有效的開發方式。

P.45
錯字一枚 倒數第4行
原:代辦
應:待辦

P.46
事實上,在Visual Studio 2012裡支援一種特殊的註解格式,只要將註解文字最前面加上 TODO: 字樣,這行註解就會自動出現在 Visual Studio 2012 的工作清單窗格中。

P.63
倒數第2行的 Package Manager Console 在中文版的 Visual Studio 2012 中是顯示成套件管理器主控台

P.63
ASP.NET MVC 4專案範本內建的會員機制,在網頁第一次執行會員機制相關頁面後,會在網站的App_Data目錄下自動建立一組預設資料庫檔案(.mdf, *.ldf),其檔名規則將會是 aspnet-專案名稱-日期時間.mdf。
Bear: 要點進去該頁面後才會產生這二個檔案..

P.117
C# 具名與選用參數的語法如下:

M(1, z: 3); // 想忽略第2個參數,那第三個參數就用具名參數的寫法
M(x: 1, z: 3); // 也可全部都用具名參數的寫法
M(z: 3, x: 1); // 傳入具名參數是不需考慮順序的

Bear:第一種的寫法沒看過,但看起來不怎麼直覺,好像容易出包。
Bear:只要不傳該參數的話,選用參數的預設值就會自動填入。

P.134
當Action執行完畢回傳ActionResult時,其實尚未真正執行回傳的ActionResult物件(通常是ViewResult物件),真正執行ActionResult物件的時間點是在Action執行完畢之後才執行的,千萬不要認為在執行Action並執行 return View(); 的時候就已經將ActionResult執行完了。

P.157
任何Entity Framework 裡的模型,都被要求一定要有主索引鍵,所以當 Entity Framework 無法識別出那個欄位是主索引鍵時,就會引發這個例外狀況。
(Bear: 且一定要設Foreign Key,無法從Code自訂。)

P.161
如果CreateOn欄位希望能有預設值,且讓.NET程式在新增資料到資料庫時不用指定其值的話,那麼你應該要在該屬性(Property)上加上一個 DatabaseGenerated 屬性(Attribute),並傳入 DatabaseGeneratedOption.Computed 參數到 DatabaseGenerated屬性(Attribute)時,記得要引用 System.ComponentModel.DataAnnotations.Schema 命名空間,否則程式將無法編譯。

P.194
由於只有方法、類別、結構、或介面可以被宣告成 Partial ,所以,當你想要在部份類別中替現有的屬性(Property)套用額外屬性(Attribute)是行不通的。

P.216
在 ASP.NET MVC 中也有另一種表達如上例簡單的回傳類型,就是直接將回傳型別設成 string 即可,這是非常簡便的撰寫方式,ASP.NET MVC會自動判斷從 Action 回傳的型別,只要不是 ActionResult 的衍生型別,就會將回傳的資料自動轉成 ContentResult輸出。

P.223
JsonResult預設的 ContentType 為 application/json ,對某些 JavaScript Framework這是必要需求,例如: jQuery。

P.231
ViewData有一個特產,就是它只會存在這次的 HTTP 要求中而已,並不像 session 可以將資料帶到下一個 HTTP 要求。

P.255
授權過濾器(Authorization Filters)是在 ASP.NET MVC 執行Controller與Action之前最由執行的過濾器,可用來對Action在正式執行前做一些類外的判斷。

P.256
在 Web.config 的 設定下有包括一個的設定,其中有個 loginUrl 可設定當權限不足時應該轉向的位址。

   
     
   


P.256
Allow Anonymous屬性通常與Authorize屬性搭配著使用。

P.256
如圖6-23所示,AccountController照理說所有Action都不應該被匿名存取,但Login()動作(Action)因為被套用了,所以在這個控制器中 Login() 動作就可以在不登入的情況下被執行。

P.271
請注意,上範例中雖然使用C#語言撰寫程式,但輸出單一變數時不需要加上分號結尾。

P.272
在頁面輸出一段含有空白字元或運算子的結果時,必須在前後加上一個小括弧。

P.272
在頁面中執行多行C#程式碼時,必須在前後加上一個大括弧。

P.272
請注意,上述範例中由於@{到}之間屬於一個C#程式碼區段,在撰寫程式時必須符合C#語言規範,也就是每段陳述式都要有分號結尾。


P.272
如果要在多行C#程式碼的Razor語法中插入HTML或其他文字內容,必須在每一行最前面加上一個@:符號,而且加上@:符號的這行程式裡,也可以再加上其它Razor變數,如下範例:
@{
    var name = "Will";
    @:你好,我是 @name
}

P.272
如果要在Razor檢視頁面中輸出@符號,可以用@符號當作跳脫字元,如下範例:
@@Will_Huang

P.273
在頁面中撰寫if判斷式
@if (ViewBag.IsEnabled)
{
    @: 啟用
}
else
{
    @: 停用
}

P.273
若要在Razor頁面使用if判斷式,並且僅傳入一個 ViewBag 參數,如果該 ViewBag 參數並不存在,其回傳的結果將為null,但是if判斷式中必須回傳 boolean型別,因此會引發"無法將null轉換成bool ,因為它是不可能為null的實值型別"例外狀況。

@if (ViewBag.IsEnabled)
改成
@if (ViewBag.IsEnabled != null && ViewBag.IsEnabled)

P.275
如果要在程式碼區塊中輸出大量文字,只要在程式碼區塊裡的前後加上一組HTML標籤即可,Razor會聰明地判斷出這不是一段C#語法,就不用在每一行前面加上@:符號了。

@if (ViewBag.IsEnabled)
{
    啟用
}
else
{
    停用
}

P.275
在頁面裡,你可以使用特殊的標籤來代替這個HTML標籤,最後輸出到瀏覽器時,不會輸出這個標籤。

P.276
也可以在多行C#程式碼段落裡使用相同的語法,利用@:或做為HTML與Razor語法之間的切換。

@{
    var is_valid = true;
    if(!is_valid)
    {
        無權限  
    }
}

P.280
Razor會自動判斷前後文,只要 @ 前面與後面都有文字的情況下,預設這次 @ 就會停用Razor語法解析,所以在Razor裡輸入Email是完全不用撰寫@跳脫字元的。

P.281
如果我們要強迫字串能原封不動的輸出,可以利用 @Html.Raw 輔助方法幫我們輸出內容。
Bear: 即不會被HtmlEncode。

P.299
若要輸出HTML屬性包含減號(-)時,例如 data-value屬性,設定C#屬性名稱必須將減號(-)改成用底線(_) 替代,最後輸出HTML屬性的時候自動會變成減號(-)。

P.313
以往在ASP.NET Web Form的開發經驗中,對於User Control使用非常頻繁,不但可以減少重複的程式碼,也利於將頁面模組化,這個好用的概念也可以用在ASP.NET MVC,只不過換了一個名字,稱為"部份檢視(Partial View)"。

P.317
透過Html.Action與Html.Partial載入部份檢視結果是一樣的,但載入的過程卻差很多。若使用 Html.Partial 載入部份檢視是透過Html.Helper直接讀取 *.cshtml檔案,直接執行該檢視並取得結果。若使用 Html.Action 的話,則會透過 Html.Helper 對 IIS 再進行一次處理常式要求(透過Server.Excute方法)。因此,使用 Html.Action 會重新執行一遍Controller的執行生命週期。

P.457
限定Action只能透過View呼叫
Bear: 利用 ChildActionOnly屬性即可達到目的,主要是要防止使用者自行輸入網址取得頁面資料。