2009-09-09 26 views
5

Thông thường các URL của tôi trông giống như tiêu chuẩn: www.example.com/controller/actionLàm cách nào để thiết lập định tuyến cho phần quản trị viên của tôi trong ASP.NET MVC?

Bây giờ tôi muốn cài đặt phần quản lý của tôi như:

 
www.example.com/admin/ 
www.example.com/admin/user/list 
www.example.com/admin/content/add 
etc. 

Vì vậy, định dạng là: www.example.com/admin/controller/action

tôi dường như không thể tìm ra làm thế nào để thiết lập các tuyến đường để nó trông giống như ở trên.

Trả lời

11

Bạn chỉ cần ánh xạ đường dẫn mới bằng phần 'quản trị' được mã hóa cứng ở đầu định nghĩa tuyến đường.

Ví dụ thêm video này vào tuyến đường của bạn trong RegisterRoutes trong file Global.asax.cs và chắc chắn rằng nó xuất hiện phía trên tuyến đường mặc định (giả sử bạn chưa thêm các tuyến đường khác):

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

Lưu ý: 'admin' phần cứng được mã hóa khi bắt đầu định nghĩa tuyến đường.

Lưu ý 2: Nếu bạn đã thêm các tuyến khác ngoài mặc định, bạn sẽ cần đảm bảo tuyến đường của bạn được sắp xếp đúng cách.

Đây là một liên kết đến một bài viết trên blog tốt từ Scott Guthrie về MVC định tuyến: URL Routing

+3

Sử dụng mọi thứ làm cho các trình điều khiển khác có thể truy cập được thông qua tiền tố 'admin/'. Người ta cũng có thể truy cập site/Home của bạn thông qua site/admin/Home của bạn. –

6

câu trả lời Kelsey là ngay trên nhãn hiệu, nhưng tôi muốn thêm một cái gì đó để thảo luận. Một tùy chọn khác là không thực sự có các tuyến "quản trị", nhưng thay vào đó yêu cầu các phiên được xác thực của quản trị viên để thực sự truy cập các url bị hạn chế.

Đây thường là cách mọi thứ được thực hiện trong các ứng dụng RESTful "truyền thống". Bộ điều khiển của bạn đại diện cho loại tài nguyên bạn đang thao tác, hành động là động từ và id là mã định danh duy nhất cho một thành viên cụ thể của tài nguyên đó.

Nói cách khác, thay vì có:

/content/list (for normal users) 
/admin/content/add (for admins) 

Bạn sẽ phải

/content/list (for everyone) 
/content/add (for admin, but must be authenticated to work) 

Thêm/admin/URL không thực sự thêm bất kỳ lợi ích hơn (ngoại trừ có lẽ bạn có thể viết logic bảo mật của bạn chỉ với một quy tắc duy nhất chống lại bất cứ điều gì dưới/admin), nhưng sự cân bằng là các tuyến đường phức tạp hơn và phá vỡ RESTful chuẩn. Phá vỡ các thực hành tiêu chuẩn không phải là một điều xấu, nhưng bạn nên xem xét rằng chúng là tiêu chuẩn vì một lý do, và trừ khi bạn có lợi ích cụ thể để phá vỡ chúng, bạn có thể xem xét tôn trọng chúng.

Cần lưu ý rằng trong cả hai kiểu URL bạn cần phải xác thực người dùng, nếu không thì bất kỳ ai cũng có thể sử dụng nó.

Trong ASP.NET MVC, bạn có thể hạn chế quyền truy cập vào các hành động (hoặc thậm chí toàn bộ bộ điều khiển) dựa trên cấp độ người dùng bằng cách sử dụng ActionFilters. Bằng cách trang trí các hành động chỉ dành cho quản trị viên của bạn với các bộ lọc này, bạn có thể đảm bảo chỉ những người dùng quản trị được xác thực mới có thể sử dụng chúng.

Đọc Scott Gu's mục nhập blog hoặc Rob Connery's post để biết thêm thông tin.

+0

Bạn sẽ xử lý hành động danh sách cho người dùng như thế nào (họ không có quyền truy cập để xem mọi thứ) và hành động danh sách cho quản trị viên (nơi họ có thể xem mọi thứ)? Tôi không muốn có một danh sách hành động listAdmin hoặc một cái gì đó ngớ ngẩn. Hay tôi đang đi sai đường. –

+0

@MrRogers - Nó thực sự phụ thuộc vào cách hai sẽ khác nhau. Nếu khác biệt duy nhất là cái nào và số lượng dữ liệu được hiển thị, bạn thường sẽ giữ nguyên chế độ xem nhưng để cho trình điều khiển chỉ định dữ liệu nào sẽ được hiển thị. Nếu hai lượt xem trên thực tế hơi khác (chẳng hạn như có nút chỉnh sửa/xóa đối với quản trị viên), bạn có thể kiểm tra trạng thái quản trị trong mẫu xem bằng câu lệnh có điều kiện. Bạn có thể đặt trạng thái quản trị trong Chế độ xem hoặc trong Phiên. Một lựa chọn cuối cùng là kéo chúng ra thành partials. Vì vậy, bạn chỉ có 1 chế độ xem, list.aspx, nhưng sau đó quản trị viên so với người dùng thông thường là từng phần trong partials. – Matt

3

Kể từ phiên bản MVC 2, họ đã thêm khái niệm 'khu vực' cho phép bạn thực hiện việc này đúng cách :) Đây là ScottGu's post about MVC 2 Preview.

+0

Các vùng là một tính năng tuyệt vời trong MVC2, nhưng trong trường hợp sử dụng cụ thể này, bạn vẫn đang chia nhỏ cùng một tài nguyên thành các bộ điều khiển khác nhau. Vì vậy, bây giờ thay vì có tất cả các "nội dung" logic của bạn với nhau trong một bộ điều khiển duy nhất, bạn đã chia nó lên. Bạn có nhiều khả năng vi phạm quy tắc DRY trong trường hợp này. Chưa kể đến sự bất hòa ngữ nghĩa. – Matt

+0

Vâng, tất cả phụ thuộc vào giao diện quản trị đang làm gì. Nếu nó là một phụ trợ cho quản trị hệ thống, đây là một điều hoàn toàn khác với nội dung của bạn. Nếu nó chỉ là thêm chức năng thì có, đề nghị của bạn chỉ giới hạn nó bằng cách xác thực có lẽ là tốt hơn. Nhưng tôi nghi ngờ đó là tất cả các giao diện quản trị. – Runeborg

Các vấn đề liên quan