Tìm kiếm Blog này

Thứ Hai, 17 tháng 1, 2011

Tùy biến địa chỉ Url cho website với ASP.NET MVC

Bài viết này mình sẽ nói làm thế nào để tùy biến địa chỉ url cho website với một vài thao tác đơn giản khi sửa đổi route và link để làm cho url thân thiện hơn!,đây là cách làm của mình,không biết thực tế người ta làm như thế nào nữa,nhưng kết quả theo mình cũng k tệ lắm,bắt chước gần giống với báo dân trí :D
Bình thường khi tạo một ứng dụng ASP.NET MVC,khi ta click vào một liên kết nào đó,nó sẽ gọi cho ta một action và truyền tham số tương ứng với action đó.
ví dụ trong hình ảnh sau : 
ảnh ghi url
tương ứng trong HomeController có 1 Action Xem với tham số truyền vào là id=13,nó sẽ trả về một bản ghi có khóa là 13,,nội dung là một bài viết của chúng ta! url được sinh ra tương ứng là
http://localhost:4021/Home/Xem/13  khi đó nếu phía sau id=13 ta chèn thêm một chuỗi ví dụ như http://localhost:4021/Home/Xem/13/Gioi-Thieu-Hue thì browser sẽ báo lỗi liền,do nó không tìm thấy được cái request url và thông báo lỗi : 


Server Error in '/' Application.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly. 

Requested URL: /Home/Xem/17/Gioi-Thieu-Hue 


Khi duyệt web trên mạng,việc click vào một cái link trên đó thể hiện rõ một phần nội dung của bài viết thì thật tiện lợi cho người sử dụng và bộ máy tìm kiếm,ví dụ bạn đọc báo dân trí với đường link sau http://dantri.com.vn/c728/s728-436018/cu-ong-84-tuoi-thi-tot-nghiep-tieu-hoc.htm thì nhìn cũng dễ chịu hơn. ở cấp độ đơn giản,chúng ta cũng sẽ làm việc tương tự để áp dụng vào website của mình. Rất may cho chúng ta,ASP.NET MVC đã cung cấp một bộ định tuyến rất dễ dàng để cài đặt vấn đề này,chỉ với 2 bước đơn giản,bạn sẽ có một url như ý .
trong View của Action hiện ra danh sách các bài viết ,ta tiến hành đặt lại link xem Details như sau 


<%: Html.ActionLink("Details", "Xem/"+item.Id.ToString()+"/"+item.TenBaiViet.ToString().Replace(' ','-'))%> | 
  thêm vào một đối tượng route trong bảng route trong file Global.asax



using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace myRoute.Web
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               "Xem", // Route name
               "Home/Xem/{id}/{op}", // URL with parameters
               new { controller = "Home", action = "Xem", id = UrlParameter.Optional } // Parameter defaults
           );
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterRoutes(RouteTable.Routes);
        }
    }
} 


rồi thôi xong!
Giải thích code: 

<%: Html.ActionLink("Details", "Xem/"+item.Id.ToString()+"/"+item.TenBaiViet.ToString().Replace(' ','-'))%> 

ta sẽ tiến hành tùy biến url thành dạng:  Xem/[số id của bài viết]/[Tên-bài-Viết] để được url ví dụ như Home/Xem/13/Gioi-Thieu-Hue
và trong file Global.asax nó sẽ bắt cái url này và dịch ra rằng,nếu bạn yêu cầu một url có dạng như Home/Xem/13/Gioi-Thieu-Hue 
tôi sẽ thực hiện action Xem với id lấy từ UrlParametter trong controller Home cho bạn,và nó sẽ trả về một view tương ứng với id đó,
còn chuỗi phía sau sẽ là tùy chọn,khi đó url chúng ta sẽ dễ hiểu hơn nhiều.
Mình không biết bộ SEO Optimize nó hoạt động ntn,nhưng mình cũng bắt chước được gần giống thế :d,url chấp nhận cả tiếng việt nữa :D
và đây là kết quả 
các bạn cần cài đặt thêm một hàm chuyển chữ có dấu sang dạng chữ tiếng việt không dấu nữa.Hàm đó có thể 
viết như thế này :
  /// <summary>
        /// Chuyển chuỗi có dấu sang không dấu
        /// </summary>
        /// <param name="s">Chuỗi cần chuyển đổi</param>
        /// <returns>Chuỗi sau khi chuyển đổi</returns>
        public static  string Convert_Chuoi_Khong_Dau(string s)
        {
            Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");
            string strFormD = s.Normalize(NormalizationForm.FormD);
            return regex.Replace(strFormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');
        }
 



2 nhận xét:

  1. hàm Convert_Chuoi_Khong_Dau thì cho vô đâu hả bạn? chỉ mình với mình đang cần gấp

    Trả lờiXóa
  2. Bạn làm rất hay .Mình đã làm được rồi .
    Chắc giờ bạn học cái này rất chắc nhỉ . mình ủng hộ bạn

    Trả lờiXóa