Tôi muốn tạo các sên tùy chỉnh cho các trang trong CMS của mình, để người dùng có thể tạo các url SEO của riêng mình (như Wordpress).ASP.NET MVC: Định tuyến sên tùy chỉnh mà không ảnh hưởng đến hiệu suất
Tôi đã từng làm điều này trong Ruby on Rails và khung công tác PHP bằng cách "lạm dụng" tuyến 404. Tuyến đường này được gọi khi không tìm thấy bộ điều khiển yêu cầu, cho phép tôi chuyển người dùng đến bộ điều khiển trang động động để phân tích cú pháp (Từ nơi tôi chuyển hướng đến 404 thực nếu không tìm thấy trang nào). Bằng cách này, cơ sở dữ liệu chỉ được truy vấn để kiểm tra slug yêu cầu.
Tuy nhiên, trong MVC tuyến bắt tất cả chỉ được gọi khi tuyến đường không phù hợp với tuyến đường mặc định là /{controller}/{action}/{id}
.
Để vẫn có thể phân tích sên tùy chỉnh Tôi đổi RouteConfig.cs
file:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
RegisterCustomRoutes(routes);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { Controller = "Pages", Action = "Index", id = UrlParameter.Optional }
);
}
public static void RegisterCustomRoutes(RouteCollection routes)
{
CMSContext db = new CMSContext();
List<Page> pages = db.Pages.ToList();
foreach (Page p in pages)
{
routes.MapRoute(
name: p.Title,
url: p.Slug,
defaults: new { Controller = "Pages", Action = "Show", id = p.ID }
);
}
db.Dispose();
}
}
Điều này giải quyết vấn đề của tôi, nhưng đòi hỏi sự Pages
bảng để được truy vấn đầy đủ cho mọi yêu cầu. Vì phương thức hiển thị quá tải (public ViewResult Show(Page p)
) không hoạt động nên tôi cũng phải truy xuất trang lần thứ hai vì tôi chỉ có thể chuyển ID trang.
- Có cách nào tốt hơn để giải quyết vấn đề của tôi không?
- Có thể chuyển đối tượng Trang sang phương thức Hiển thị của tôi thay vì ID trang không?
Không phải nó chỉ được khởi tạo khi khởi động ứng dụng? Chỉ trên một mặt lưu ý: 'db.Dispose();'? Edit: Xin lỗi tôi đã không đọc câu hỏi của bạn rất tốt. Có lẽ bạn có thể đặt các trang trong bộ đệm ẩn toàn cục? – Silvermind
Cảm ơn bạn đã chỉ đúng hướng! Chức năng này thực sự chỉ được gọi khi khởi động. Tôi đoán tôi đã nhìn vào nó như thể nó là một ngôn ngữ diễn giải (như PHP). Xem xét đây là mã chỉ được thực thi khi khởi động tôi đoán tác động hiệu suất là không đáng kể. Tuy nhiên, tôi vẫn không chắc chắn nếu đây là cách để đi, hoặc nếu điều này đã đạt được bằng cách sử dụng chức năng dựng sẵn. Tôi cũng vẫn tự hỏi liệu có thể chuyển Mô hình thay vì ID (Câu hỏi số 2) hay không. – christiaanderidder