2008-12-18 42 views
13

Tôi phải dày đặc. Sau khi hỏi một số câu hỏi về StackOverflow, tôi vẫn còn thua lỗ khi nói đến việc nắm bắt công cụ định tuyến mới được cung cấp với ASP.NET MVC. Tôi nghĩ rằng tôi đã thu hẹp vấn đề xuống một vấn đề rất đơn giản, nếu được giải quyết, có lẽ sẽ cho phép tôi giải quyết các vấn đề định tuyến còn lại của tôi. Vì vậy, đây là:Câu hỏi định tuyến ASP.NET MVC

Làm cách nào bạn đăng ký tuyến đường để hỗ trợ URL giống như Twitter cho hồ sơ người dùng?

www.twitter.com/username

Giả sử nhu cầu cũng hỗ trợ:

  • mặc định {controller}/{action}/{id} tuyến.

  • URL như:

    www.twitter.com/login
    www.twitter.com/register

Đây có phải là có thể?

+0

này là một tiện ích hữu ích quá: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx –

+0

Hi Kevin, bạn đã nhận được câu trả lời của bạn ?? – Parminder

+0

Kiểm tra câu hỏi này: [Tính năng Định tuyến Web hoạt động như thế nào?] (Http://stackoverflow.com/questions/43243/how-does-web-routing-work#43363) – jfs

Trả lời

10

gì về

routes.MapRoute(
    "Profiles", 
    "{userName}", 
    new { controller = "Profiles", action = "ShowUser" } 
); 

và sau đó, trong ProfilesController, sẽ có chức năng

Trong hàm, nếu không tìm thấy người dùng nào với userName được chỉ định, bạn nên chuyển hướng đến {controller}/{action}/{id} mặc định (ở đây, nó chỉ là {controller}).

Các url như www.twitter.com/login phải được đăng ký trước URL đó.

routes.MapRoute(
    "Login", 
    "Login", 
    new { controller = "Security", action = "Login" } 
); 
0

Bạn có thể xử lý điều đó trong bộ điều khiển nhà, nhưng phương pháp điều khiển sẽ không rất thanh lịch. Tôi đoán điều gì đó nhưsức công việc này (không kiểm tra):

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

Sau đó, trong HomeController của bạn:

public ActionResult Index(string view) { 
    switch (view) { 
     case "": 
      return View(); 

     case "register": 
      return View("Register"); 

     default: 
      // load user profile view 
    } 
} 
+2

Ngay cả khi điều này có hiệu quả, tôi không đề xuất bạn làm đi. Nó có mùi :) –

4

Điều quan trọng cần hiểu là các tuyến đường khớp với thứ tự chúng được đăng ký. Vì vậy, bạn cần phải đăng ký tuyến đường cụ thể nhất trước tiên và cuối cùng chung nhất, hoặc tất cả các yêu cầu khớp với tuyến đường chung sẽ không bao giờ đến được tuyến đường cụ thể hơn.

Vì sự cố của bạn, tôi sẽ đăng ký quy tắc định tuyến cho từng trang đặc biệt, như "đăng ký" và "đăng nhập" trước quy tắc tên người dùng.

0

OK Tôi chưa từng thử cách này, nhưng bạn đã thử mở rộng lớp RouteBase để xử lý người dùng. Các tài liệu cho RouteBase gợi ý rằng phương thức GetRouteData sẽ trả về null nếu nó không khớp với yêu cầu hiện tại. Bạn có thể sử dụng điều này để kiểm tra xem yêu cầu có khớp với một trong các tên người dùng bạn có hay không.

Bạn có thể thêm một lớp con RouteBase sử dụng:

routes.Add(new UserRouteBase()); 

Khi bạn đăng ký các tuyến đường.

Có thể đáng để điều tra.

0

tôi nghĩ câu hỏi của bạn tương tự như câu hỏi của tôi. ASP.NET MVC Routing

đây là nội dung được trả lời robert harvey.

routes.MapRoute(_ 
    "SearchRoute", _ 
    "{id}", _ 
    New With {.controller = "User", .action = "Profile", .id = ""} _ 

)

0

Dưới đây là một cách khác để Standar đăng ký tuyến đường:

1. Tải RiaLibrary.Web.dll và tham khảo nó trong dự án trang web ASP.NET MVC của bạn

2. Trang trí các phương pháp điều khiển với các thuộc tính [Url]:

public SiteController : Controller 
{ 
    [Url("")] 
    public ActionResult Home() 
    { 
     return View(); 
    } 

    [Url("about")] 
    public ActionResult AboutUs() 
    { 
     return View(); 
    } 

    [Url("store/{?category}")] 
    public ActionResult Products(string category = null) 
    { 
     return View(); 
    } 
} 

BTW, '?' đăng nhập tham số '{? category}' có nghĩa là tham số là tùy chọn. Bạn sẽ không cần phải xác định này một cách rõ ràng trong giá trị mặc định tuyến đường, đó là tương đương như sau: nộp

routes.MapRoute("Store", "store/{category}", 
new { controller = "Store", action = "Home", category = UrlParameter.Optional }); 

3. Cập nhật Global.asax.cs

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

     routes.MapRoutes(); // This do the trick 
    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 

Làm thế nào để thiết lập giá trị mặc định và hạn chế? Ví dụ:

public SiteController : Controller 
{ 
    [Url("admin/articles/edit/{id}", Constraints = @"id=\d+")] 
    public ActionResult ArticlesEdit(int id) 
    { 
     return View(); 
    } 

    [Url("articles/{category}/{date}_{title}", Constraints = 
     "date=(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")] 
    public ActionResult Article(string category, DateTime date, string title) 
    { 
     return View(); 
    } 
} 

Làm thế nào để thiết lập trật tự? Ví dụ:

[Url("forums/{?category}", Order = 2)] 
public ActionResult Threads(string category) 
{ 
    return View(); 
} 

[Url("forums/new", Order = 1)] 
public ActionResult NewThread() 
{ 
    return View(); 
} 
Các vấn đề liên quan