2013年4月12日星期五

Visual Studio 2012 Update 2 - ASP.NET 4.5 簡易 Friendly URLs

上一次的Visual Studio 2012 Update 1 沒有太大驚喜,至少跟ASP.NET沒有太大關係,但今次的Update 2就為ASP.NET帶來兩個新亮點,分別是正式官方支持的SignalRFriendly URLs framework

前者的實時反應功能之強大,已經很為人所知了,但由網上的搜尋結果和CodePlex所見,後者可能比較"受冷落"。

傳統的Webforms都是*.aspx做Extension,到了ASP.NET 4.0雖然原生支援RESTful URLs,但老實說,似乎Webforms的開發者不太熱衷於它,即使我自己都不強求。
跟ASP.NET MVC不同,MVC是強制性要求做URL routing,但Webforms則是選擇性質,維護Global.asax的Routing Tables亦挺煩的,最主要或者Webforms開發者都習慣了QueryString (product.aspx?id=12) 的方式取Parameter了。
可以參考Wikipedia - Clean URL

顧名思義,Friendly URLs framework,就是把傳統*.aspx的Extension拿掉,可以很簡單地就做到好像很Cool的Restful Url,不用做routes.MapRoute()或RegisterRoutes等動作。

示範
來看看簡短的示範 :
1. 安裝Visual Studio 2012 Update 2之後,新建一個Web Project。


2. 什麼都不用修改,直接按"F5"執行Project。起動後,按下網面上的連結 (關於 / 連絡人),之後看看IE的網址列,已經是RESTful URL了! 它直接指向你的About.aspx和Contact.aspx !


沒錯,Friendly URLs framework已經是Webforms Project Template的預設成員,打開Reference看一看,就會見到Microsoft.AspNet.FriendlyUrls的NameSpace了。


其實Template已經替你做了一些功夫,打開Global.asax看看Application_Start()部份,就會看到這行 :
RouteConfig.RegisterRoutes()

public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // 應用程式啟動時執行的程式碼
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }

打開App_Start資料夾的RouteConfig.cs,就會見到最關鍵的方法 - EnableFriendlyUrls()
using Microsoft.AspNet.FriendlyUrls;

    public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.EnableFriendlyUrls();
        }
    }

EnableFriendlyUrls()並不是RouteCollection 原生的方法,它是Microsoft.AspNet.FriendlyUrls所產生的Extension Methods。

所花的功夫就是那麼少,加上幾句便成。

建立RESTful Url
若我要建立一條RESTful URL,例如
http://localhost:56046/About/Blog/12
方法很簡單,使用FriendlyUrl.Href()方法 :
<%@ Import Namespace="Microsoft.AspNet.FriendlyUrls" %>
<a href="<%: FriendlyUrl.Href("~/About", "Blog", 12) %>">I am Restful!</a>

Request.QueryString
那麼如何取得Url的Parameter呢?
無論Webform還是MVC,RESTful URL是沒有"?category=Blog&postid=12" 這樣式,雖然你依然可以這樣做,程式上是容許的。
但就有點兒破格了。

以剛剛的About頁做例子,URL應該寫做" /About/Blog/12"

那取出網址部份的程式碼如下 :
using Microsoft.AspNet.FriendlyUrls;

namespace WebApplication1
{
    public partial class About : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("<ol>");
            foreach (var segment in Request.GetFriendlyUrlSegments())
                Response.Write("<li style='color:red;font-size:18px;'>" + segment.ToString() + "</li>");
            Response.Write("</ol>");

            if (FriendlyUrl.Segments.Count > 2)
            {
                Response.Write("<ul>");
                Response.Write("<li style='color:red;font-size:18px;'>" + FriendlyUrl.Segments[0] + "</li>");
                Response.Write("<li style='color:red;font-size:18px;'>" + FriendlyUrl.Segments[1] + "</li>");
                Response.Write("</ul>");
            }
        }
    }

}

可以使用Request.GetFriendlyUrlSegments()得到List<string>的值,或者直接使用FriendlyUrl.Segments以zero-indexed型式取出。


記得ASP.NET MVC推出時,很多人擔心Microsoft會放棄Webforms,但現在看來不用擔心。
Microsoft把MVC的功能都移植到Webforms了。

沒有留言:

發佈留言