標籤

2011年11月29日 星期二

選擇器

使用CSS控制頁面
行內樣式
 style="color:#0000FF; font-size:18px; font-weight:bold;

內嵌式
style type="text/css"
p{
color:#FF33CC;
text-decoration:underline;
font-style:italic;
font-size:28px;
}

連結式
link href="4444.css" type="text/css" rel="stylesheet"


CSS選擇器
標記選擇器
h4{
color:red;
font-size:18px;
}

類別選擇器
.special{
color:green;
}
h4.special{
color:red; /* 藍色 */
font-size:14px; /* 文字大小 */
}

ID選擇器
#one{
font-weight:bold; /* 粗體 */
}
#two{
font-size:16px; /* 字體大小 */
color:#99ff00; /* 顏色 */
}

屬性選擇器
a[title]{
text-decoration:none; /* 沒有下劃線 */
color:#333300;
}
a[title=CSS1]{
text-decoration:none; /* 沒有下劃線 */
color:#333300;
}

巢狀選擇器
p b{
color:maroon; /* 顏色 */
text-decoration:underline; /* 下劃線 */
font-size:36px; /* 文字大小 */
}

子選擇器
ul.myList > li >  a{
text-decoration:none; /* 沒有下劃線 */
color:#00ff00;
}

選擇器集體宣告
h1, h2, h3, h4, h5, p{
color:purple; /* 文字顏色 */
font-size:14px; /* 字體大小 */
}
h2.special, .special, #one{
text-decoration:underline; /* 下劃線 */
}

2011年11月11日 星期五

初學ASP的寫法

Focus物件
If dgv1.Rows.Count > 0 Then dgv1.Rows(0).FindControl(1).Focus()
TextBox按下Enter後將焦點指向某個BUTTONtxtQuery.Attributes.Add("onkeydown", "if(event.keyCode == 13) document.getElementById('" + btnQuery.ClientID + "').focus()")

If Not IsPostBack Then

物件轉型
Dim l As Label = DirectCast(sender, Label)
Dim txtrowcount As TextBox = CType(e.Row.FindControl("txtrowcount"), TextBox)

If (e.Row.RowState And DataControlRowState.Edit) > 0 Then e.Row.Focus()
If e.Row.Cells(1).Controls.Count > 0 Then e.Row.Cells(2).Controls(0).Focus()

Dim col As TemplateField
col = New TemplateField
col.ItemTemplate = New MyGdvTemplate(DataControlRowType.DataRow, "cuNUMB")
col.HeaderTemplate = New MyGdvTemplate(DataControlRowType.Header, "編號")
dgv1.Columns.Add(col)

2011年11月8日 星期二

Target 屬性

目標值
描述
_blank
在無框架的新視窗中呈現內容。
_parent
在即時父代框架組中呈現內容。
_search
在搜尋窗格中呈現內容。
_self
在擁有焦點 (Focus) 的框架中呈現內容。
_top
在無框架的完整視窗中呈現內容。

注意事項
請查閱您的瀏覽器文件,以判斷是否支援 _search 值。例如,Internet Explorer 5.0 及以上版本支援 _search 目標值。

這項屬性會套用至 Menu 控制項中的所有功能表項目。您可以直接設定每個 MenuItem 物件的 Target 屬性,選擇性地覆寫這項屬性。

注意事項
Target 屬性 (Property) 會以目標屬性 (Attribute) 呈現。XHTML 1.1 嚴格文件型別定義中不允許 anchor 項目中的目標屬性。如果 HyperLink 的呈現輸出必須相容於 XHTML 1.1,請勿設定 Target 屬性。如需詳細資訊,請參閱主題 ASP.NET 和 XHTML

建立可存取的 Web 網頁時,強烈建議您避免使用 Target 屬性指向另外一個視窗。如需詳細資訊,請參閱 ASP.NET 網頁可及性

MVC Routing 觀念與技巧

參考The will will Web
http://blog.miniasp.com/post/2011/08/01/ASPNET-MVC-Developer-Note-Part-21-Routing-Concepts-and-Skills.aspx


以下文字用來描述上圖標號的部分:
  1. ASP.NET 執行的起點就在於 HttpApplication 的 Application_Start() 方法,所有 Routing 都會定義在此,其中 RouteTable.Routes 是一個公開靜態物件,用來儲存所有的 Routing 規則,其物件型別為 RouteCollection
  2. 在預設 RegisterRoutes 方法中的 IgnoreRoute 用來定義 不要透過 Routing 處理的網址
    註: IgnoreRoute 擴充方法是 ASP.NET MVC (System.Web.Mvc) 的一部份。
  3. {resource} 代表一個 路由變數(RouteValue),其名稱為 resource,但在這裡其實取任何名字都可以,這裡只代表一個變數空間 (PlaceHolder) 罷了。總之就是代表一個「位置」,可以放入一個用不到的變數。
  4. {*pathInfo} 也是代表一個 RouteValue 名稱為 pathInfo,但名稱前面的星號 ( * ) 代表 CatchAll 的意思,這個名為 pathInfo 的 RouteValue 會是完整的 PATH INFO 扣除 標號 3 比對到的網址。例如:若網址是 /TEST.axd/a/b/c/d 則 pathInfo 所得到的值為 a/b/c/d,如果沒加上星號 ( * ) 該 pathInfo 就會等於 a 而已。而在這裡其實取任何名字都可以,這裡也只是代表一個變數的位置。
  5. MapRoute 則是最常用來定義 Routing 規則的擴充方法。
    註: MapRoute 擴充方法是 ASP.NET MVC (System.Web.Mvc) 的一部份。
  6. 定義 Route 名稱,這個名稱雖然少用,但是開發到較為進階的 Routing 技巧時會用到。
  7. 定義 網址格式 與每個 網址段落(Path Segment) 的 RouteValue 參數名稱
    注意: 該網址不能以斜線 ( / ) 開頭。
  8. 定義各 RouteValue 參數預設值
路由開發技巧
技巧 1:替 Routing 網址設立條件限制
由於 ASP.NET MVC 有個很重要的特性:以習慣取代設定 (Convention over Configuration),所以當我們從網址路徑對應到 Controller 的過程中,網址列上的路由變數會自動對應到 Action 方法的參數中,例如我們在 Global.asax.cs 檔案中有以下路由定義:
routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);
而我們的 Action 方法的內容如下:
public ActionResult Details(int productId)
{
    return View();
}
因為我們 Action 方法裡的參數是 int 型別,所以傳入的 productId 路由變數必須要是「整數」,如果不是整數的話,就會導致 The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.ActionResult Details(Int32)' in ... 的錯誤發生。

要避免這種無效的網址路由比對,我們可以在定義路由時多下一些限制條件,來進一步比對 網址段落(PathSegment) 是否符合 路由變數(RouteValue) 的格式要求,我們以上述例子來進一步修改路由定義,如下程式範例,我們多增加了一個參數傳入 MapRoute 參數,其中 \d+ 是 正規表示式(RegEx) 樣式:
routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );
注意:這裡的 RegEx 樣式在比對時會自動幫你加上 ^ 開頭與 $ 結尾,也代表這個樣式一定會比對完整的網址段落(Path Segment)。
如此一來,當網址輸入的格式是 /Product/CellPhone 的時候,就不會比對到 "Product" 這一條路由規則。


技巧 3:讓 ASP.NET MVC 與 ASP.NET Web Form 和平共處
基於 ASP.NET MVC 與 ASP.NET Web Form 的運作方式不同,所以通常這兩種架構下的程式在預設的情況下都能正常的運作,只有在某些特殊的設定下才會兩邊互相干擾,當你網站部署時遇到互相干擾的狀況時,就可以套用以下 Routing 技巧,設定特定一些路徑不要走 ASP.NET MVC 的執行管線。
以下是一些過濾掉路由規則定義的程式碼範例:
  • 忽略所有 *.aspx 的網址路徑
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
  • 忽略所有在 Page 目錄下的所有程式與檔案 ( 請注意,這是忽略 Routing 而已,改由 IIS 來判斷要用何種 Handler 來處理這次 HTTP 要求 )
    routes.IgnoreRoute("Page/{*pathInfo}");
  • 忽略所有在 Page 目錄下的所有檔案 ( 另一種寫法 )
    routes.Add(new Route("Page/{*pathInfo}", new StopRoutingHandler()));
另外還有一點也值得注意,也就是 Routing 的動作其實是在執行 HttpHandler 執行之前,他是一個專門用來分配 Request 的模組,所以可以透過 Routing 的定義與設定來決定到底後續要執行 ASP.NET MVC 還是 ASP.NET Web Form,在 IIS7 的 HTTP Request 的執行順序中,UrlRoutingModule (Routing module) 的執行順位如下圖示,執行事件名稱為 Resolve Cache 這一步之後(PostResolveRequestCache):

再整理,待續....



MVC Control 路由與 URL Routing 設定注意事項


Routing 設定注意事項

參考The will will Web

在 Global.asax.cs 中的 RegisterRoutes 方法,但如果 ASP.NET MVC 越寫越多之後,可能就會開始想要做點變化了
1. 讓 IIS6 安裝設定 ASP.NET MVC 時不用修改 萬用字元應用程式對應 (Wildcard Script Map)
預設 ASP.NET MVC 專案新增完後,在 Global.asax.cs 中有個 RegisterRoutes 方法:


        routes.MapRoute( _
                "Default", _
                "{controller}/{action}/{id}", _
                New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
            )


可能會直接在 RegisterRoutes 加上以下程式碼:
        routes.MapRoute( _
        "EQuery", _
        "{EQuery}/{name}", _
        New With {.controller = "EQuery", .action = "Search", .id = UrlParameter.Optional} _
        )

然後把原本那個 routes.MapRoute 方法中的 {controller} 加上 .aspx (如下圖示),但這會掉入一個很容易犯錯的地方:忘記將原本的 Default Route 中的 controller = "Home", 移除

如果你沒有移除這段程式,Root 這個 Routing 規則等於是完全沒用的,永遠不會執行到!
在簡單的 Routing 下雖不會導致任何問題,但若需要用到此文章第三個開發技巧時,就有很大的關係了。

2. 首頁的 Routing 網址跟 Global.asax.cs 中的 Routing 設定有很大的關係
如上圖所示,Default 與 Root 這兩個 Routing 的撰寫順序是有差別的,當你利用 HtmlHelper UrlHelper 產生連結時,差別就在於顯示連結不一樣:
<%= Html.ActionLink("Home", "Index", "Home")%>


Url.Action("Index", "Home");
第一種:Default 在前、Root 在後
        routes.MapRoute( _
                "Default", _
                "{controller}/{action}/{id}", _
                New With {.action = "Index", .id = UrlParameter.Optional} _
            )

        routes.MapRoute( _
        "EQuery", _
        "{EQuery}/{name}", _
        New With {.controller = "EQuery", .action = "Search", .id = UrlParameter.Optional} _
            )
所得到的連結將會是 /Home.aspx(首頁網址比較醜)
第二種:Root 在前、Default 在後
        routes.MapRoute( _
        "EQuery", _
        "{EQuery}/{name}", _
        New With {.controller = "EQuery", .action = "Search", .id = UrlParameter.Optional} _
        )

        routes.MapRoute( _
                "Default", _
                "{controller}/{action}/{id}", _
                New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
            )
所得到的連結將會是 / (首頁網址比較漂亮)
3. 設定「網站首頁」依據不同瀏覽器自動轉址到不同首頁
當你的網站同時提供多種平台的網頁(例如:桌上、PDA、WAP、…),你可能會想在首頁 ( ) 加上自動瀏覽器型別的判斷,用以轉向到不同的網站首頁。這個技巧就跟上述第一個注意事項所示的錯誤有很大的關係,寫不好就會導致網頁轉向的無窮迴圈。
程式範例如下,在 HomeController 下新增一個 BrowserCheck() Action:
  1. public ActionResult BrowserCheck()  
  2. {  
  3.     // Windows CE (Pocket PC)  
  4.     if (!String.IsNullOrEmpty(Request.Headers["UA-OS"])   
  5.         && Request.Headers["UA-OS"].Contains("Pocket PC"))  
  6.     {  
  7.         return Redirect("/PocketPC");  
  8.     }  
  9.     // SymbianOS  
  10.     else if (!String.IsNullOrEmpty(Request.Headers["User-Agent"])   
  11.              && Request.Headers["User-Agent"].Contains("SymbianOS"))  
  12.     {  
  13.         return Redirect("/SymianOS");  
  14.     }  
  15.     else  
  16.     {  
  17.         return Redirect(Url.Action("Index"));  
  18.     }  










接著在 Global.asax.cs 中的 RegisterRoute 修改成如下:

  1. public static void RegisterRoutes(RouteCollection routes)  
  2. {  
  3.     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  4.   
  5.     routes.MapRoute(  
  6.         "Default",  
  7.         "{controller}/{action}/{id}",  
  8.         new { action = "Index", id = "" });  
  9.   
  10.     routes.MapRoute(  
  11.       "Root",  
  12.       "",  
  13.       new { controller = "Home", action = "BrowserCheck", id = "" });  
  14. }  

由於我們在 BrowserCheck() Action 中的預設的轉址(Redirect)路徑為 Url.Action("Index"),所產生的連結是依據 Global.asax.cs -> RegisterRoute 方法中的規則所決定的,如果 Routing 寫錯就會導致每次都會再連到首頁 ( ) 導致無窮迴圈, 以下是發生無窮迴圈的錯誤範例:
首先,錯誤的 Routing 定義如下:
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
      "Home",
      "",
      new { controller = "Home", action = "BrowserCheck", id = "" });

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" });
}

如果你用瀏覽器直接打 http://mysite/ 所執行的永遠是 "Home" Routing,不可能跑到 "Default" Routing
如果你利用 HtmlHelper 或 UrlHelper 產生首頁連結時,如下範例:
Url.Action("Index", "Home");
這時會選用 “Default”Routing 的 Rule,因為只有這個 Rule 最符合,因為你放了 controller 參數的預設值,所以網址列並不會出現 Controller 的名稱,產生的網址就會是根目錄( )。
所以使用者點擊首頁時就會變成這樣:
  1. 瀏覽器連結到 http://mysite/ ,並觸發 BrowserCheck() Action
  2. BrowserCheck() Action 轉址到 Url.Action("Index", "Home") 也就是網站根目錄( )
  3. 然後又回到步驟 1,正式開始無窮回圈!
學習 ASP.NET MVC 一定要搞懂 Routing,雖然是簡單的東西,但對於第一次接觸 ASP.NET MVC 的人可能還不太容易理解整個來龍去脈,多寫 Code 遇到一些問題後觀念就會越來越清晰了。










英文說明
http://www.pluralsight-training.net/microsoft/players/PSODPlayer?author=scott-allen&name=mvc3-building-controllers&mode=live&clip=0&course=aspdotnet-mvc3-intro

MSDN說明
http://msdn.microsoft.com/zh-tw/library/cc668201(VS.90).aspx
http://msdn.microsoft.com/zh-tw/magazine/dd695917.aspx

ASP.NET 路由與 URL 重寫的比較


路由定義 比對 URL 的範例
{controller}/{action}/{id}
/Products/show/beverages
{table}/Details.aspx
/Products/Details.aspx
blog/{action}/{entry}
/blog/show/123
{reporttype}/{year}/{month}/{day}
/sales/2008/1/5
{locale}/{action}
/en-US/show
{language}-{country}/{action}
/en-US/show
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    RegisterRoutes(RouteTable.Routes)
End Sub

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    Dim urlPattern As String
    Dim categoryRoute As Route

    urlPattern = "Category/{action}/{categoryName}"
    categoryRoute = New Route(urlPattern, New CategoryRouteHandler)
    categoryRoute.Defaults = New RouteValueDictionary(New With _
        {.categoryName = "food", _
         .action = "show"} )

    routes.Add(categoryRoute)
End Sub

ASP.NET 路由處理 URL 要求時,範例中顯示的路由定義 (categoryName  food 以及 action  show 的預設值) 
會產生如下表列出的結果:
URL 參數值
/Category
action = "show" (預設值)
categoryName = "food" (預設值)
/Category/add
action = "add"
categoryName = "food" (預設值)
/Category/add/beverages
action = "add"
categoryName= "beverages"
從路由建立 URL




Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    routes.Add(New Route( _
      "Category/{action}/{categoryName}", _
      New RouteValueDictionary(New With _
          {.categoryName = "food", _
           .action = "show"}), _
           New CategoryRouteHandler()) )
End Sub
Dim urlParameters As RouteValueDictionary
urlParameters = New RouteValueDictionary(New With {.categoryName = "beverages", _
        .action = "summarize"})
HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath _
    (context, urlParameters).VirtualPath
這段程式碼執行時,HyperLink1 控制項會在 NavigateUrl 屬性中加入 "Category/summarize/beverages" 這個值。
當您要從路由建立 URL 時,可以加入路由的名稱,從而指定要使用哪一個路由
名稱Framework 行為產生方法
ContentResult您可以將字串值直接將 HTTP 回應。內容
EmptyResult不會寫入 HTTP 回應。
FileContentResult會在檔案 (表示為位元組陣列) 的內容,並將內容寫入為 HTTP 回應。檔案
FilePathResult在指定的位置會在檔案的內容,並寫入 HTTP 回應的內容]。檔案
FileStreamResult接受控制器所產生檔案資料流,並寫入 HTTP 回應的資料流中。檔案
HttpUnauthorizedResult授權檢查失敗時,授權篩選器會使用一個特殊的結果。
JavaScriptResult回應用戶端使用用戶端執行指令碼。JavaScript
JsonResult回應用戶端 JavaScript Object Notation (JSON) 資料。json
RedirectResult重新導向至新的 URL 的用戶端。重新導向
RedirectToRouteResult呈現指定的檢視 (通常是在 AJAX 的案例中使用) 的 HTML 片段的回應。RedirectToRoute / RedirectToAction
PartialViewResult呈現指定的檢視 (通常是在 AJAX 的案例中使用) 的 HTML 片段的回應。PartialView
ViewResult呈現指定的檢視,並以 HTML 用戶端回應。檢視














使用 DiskSpd 測試磁碟效能

  DiskSpd 是微軟創建的命令行磁碟測試工具。它結合了強大的IO工作負載定義來測量磁碟效能。由於它支援自由配置和調整參數,使其成為存儲效能測試、驗證和基準測試的理想工具。 步驟 1. 從 GitHub (說明) https://github.com/Microsoft/di...