01/10/2018, 17:32

Tạo outgoing url trong asp.net mvc

Chúng ta cần đăng ký một route mẫu để tìm hiểu tiến trình tạo ra outgoing url của asp.net mvc. Chúng ta mở file Global.asax để đăng ký một route như sau: public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute("MyRoute", "{controller}/{action}/{id}" ...

Chúng ta cần đăng ký một route mẫu để tìm hiểu tiến trình tạo ra outgoing url của asp.net mvc. Chúng ta mở file Global.asax để đăng ký một route như sau:

public static void RegisterRoutes(RouteCollection routes) { 

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

1. Tạo outgoing url trong view
Dùng phương thức ActionLink của lớp Html

@Html.ActionLink("About this application", "About")

Hai tham số chúng ta truyền vào phương thức ActionLink là đoạn text và tên của action. Phương thức ActionLink của chúng ta sẽ tạo ra mã html như sau.

<a href="/Home/About">About this application</a>

Chúng ta để ý có thêm controller Home trong đoạn mã html được tạo ra vì phương thức ActionLink của chúng ta tạo ra mã html dựa trên cái mẫu route mà chúng ta định nghĩa ở phía trên

Giả sử như chúng ta có nhiều route như sau thì phương thức ActionLink của chúng ta sẽ xử lý như thế nào?

public static void RegisterRoutes(RouteCollection routes) { 

    routes.MapRoute("NewRoute", "App/Do{action}", 
        new { controller = "Home" }); 

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

Kết quả sẽ là như sau:

<a href="/App/DoAbout">About this application</a>

Tuy nhiên, chúng ta có thể trỏ đến những controller theo ý muốn của chúng ta như sau:

@Html.ActionLink("About this application", "About", "MyController")

Mã lệnh trên sẽ tạo ra html như sau:

a href="/MyController/About"About this application/a

Truyền thêm giá trị khi tạo outgoing url
Chúng ta có thể truyền thêm giá trị cho các biến segment. Giả sử như chúng ta dùng mẫu route ở đầu bài viết

@Html.ActionLink("About this application", "About", new { id = "MyID" })

Đoạn mã trên sẽ tạo ra mã html như sau

<a href="/Home/About/MyID">About this application</a>

Giả sử chúng ta cung cấp các giá trị không khớp với url pattern của chúng ta như đoạn mã dưới đây thì outgoing url của chúng ta sẽ như thế nào?

@Html.ActionLink("About this application", "About",  
    new { id = "MyID", myVariable = "MyValue" })

Khi chúng ta cung cấp các giá trị không khớp với url pattern thì nó sẽ nhét vào outgoing url của chúng ta như là query string. Html được tạo ra của đoạn mã trên như sau:

<a href="/Home/About/MyID?myVariable=MyValue">About this application</a>

Nếu chúng ta cung cấp giá trị cho các biến segment mà nó trùng với giá trị mặc định của route thì nó giá trị đó sẽ được loại bỏ khỏi outgoing url của chúng ta. Giả sử như:

@Html.ActionLink("About this application", "Index", "Home")

Đoạn mã trên sẽ tạo ra html như sau:

<a href="/">About this application</a>

Thêm html attribute khi tạo outgoing url
Ngoài việc chúng ta có thể tạo ra url cho thể thẻ anchor, chúng ta cũng có thể thêm các html attribute cho thẻ anchor của chúng ta. Đoạn mã sau sẽ thêm attribute id và class vào thẻ anchor của chúng ta:

@Html.ActionLink("About this application", "Index", "Home", null,  
    new {id = "myAnchorID", @class = "myCSSClass"})

Đoạn mã trên sẽ tạo ra mã html như sau:

<a class="myCSSClass" href="/" id="myAnchorID">About this application</a>

Tạo outgoing url có đầy đủ như giao thức, domain,…
Các đoạn mã từ đầu đến bây giờ của chúng ta chỉ tạo ra các relative url. Tuy nhiên trong một vài tình huống chúng ta cần url có đầy đủ thông tin như là tình huống chúng ta cần nhúng một cái link có đầy đủ giao thức, tên domain, controller… vào một email
Để giải quyết điều này chúng ta có thể viết đoạn mã như sau:

@Html.ActionLink("About this application", "Index", "Home",  
    "https", "gockinhnghiem.com", " myFragmentName",  
    new { id = "MyId"}, 
    new { id = "myAnchorID", @class = "myCSSClass"})

Đoạn mã trên sẽ tạo ra htm như sau:

About this application

Tạo outgoing url và không có link (không có thể anchor)
Html.ActionLink giúp cho chúng ta tạo ra các thẻ <a>. Tuy nhiên, trong một vài trường hợp, chúng ta chỉ muốn có chuỗi url mà không cần có thẻ <a>. Url.Action sẽ giúp chúng ta làm điều này như đoạn mã sau:

My URL is: @Url.Action("Index", "Home", new { id = "MyId" })

Đoạn mã trên sẽ tạo ra kết quả như sau:

My URL is: /Home/Index/MyId

Tạo link và url từ route data
Tạo link từ anonymous type

@Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})

Kết quả

Routed Link

Và chúng ta cũng có thể tạo url từ anonymous type

@Url.RouteUrl(new { controller = "Home", action = "About", id = "MyID" })

2. Tạo outgoing url trong các action
Thông thường, chúng ta chỉ tạo ra các link và url trong view. Tuy nhiên, đôi khi chúng ta muốn tạo chúng trong các action của controller như sau

public ViewResult MyActionMethod() { 
    string myActionUrl = Url.Action("Index", new { id = "MyID" }); 
    string myRouteUrl = Url.RouteUrl(new { controller = "Home", action = "Index" }); 
} 

Hoặc chúng ta muốn redirect người dùng đến một url khác như sau:

public ActionResult MyActionMethod() { 
    return RedirectToAction("Index"); 
} 

Hoặc có thể uyển chuyển hơn:

public ActionResult MyOtherActionMethod() { 
    return RedirectToRoute(new { controller = "Home", action = "Index", id = "MyID" }); 
} 

3. Tạo outgoing url từ route mà mình muốn
Ở đầu bài viết, chúng ta có định nghĩa một vài route như:

public static void RegisterRoutes(RouteCollection routes) { 

    routes.MapRoute("NewRoute", "App/Do{action}", 
        new { controller = "Home" }); 

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

Những tên của route như NewRoute, MyRoute ngoài việc gợi nhớ cho chúng ta mục đích của route mà còn giúp cho chúng ta tạo ra các link theo tên route như:

@Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" }); 

Hoặc chỉ tạo chuỗi url bằng Url.RouteUrl


0