2010-03-02 21 views
5

ASP.NET MVC có chứa bất kỳ đường viền nào được khắc vào mã không? nếu có, làm cách nào để xác định ràng buộc ngày giờ?ASP.NET MVC có bất kỳ ràng buộc tuyến đường DateTime nào không?

ví dụ: url:

http://mydomain.com/{versionDate}/{controller}/{action} 
http://mydomain.com/2010-01-20/search/posts 

cổ vũ :)

+0

Bạn có ý nghĩa gì về ràng buộc ngày giờ? Giá trị của ràng buộc đó đến từ đâu? Bạn muốn nó định tuyến như thế nào dựa trên ràng buộc đó? Có thể ràng buộc đó chỉ đơn giản là một tham số cho một bộ điều khiển, mà chuyển hướng hơn nữa hoặc gọi các phương thức điều khiển khác theo thuật toán? – jrista

+0

thông báo cách tôi có một vị trí trong tuyến đường cho VersionDate? tôi đã hy vọng rằng nếu một người đặt một ngày không hợp lệ trong đó, nó sẽ lỗi. Như vậy, tôi nghĩ rằng nó sẽ là tốt nhất để đặt một tuyến đường - ràng buộc trên tham số tuyến đường đó .. để ngăn chặn dữ liệu xấu được thông qua. –

Trả lời

10

Tôi đã quyết định ràng buộc tuyến đường của riêng mình. chỉ mất một vài phút.

using System; 
using System.Web; 
using System.Web.Routing; 

namespace Whatever.Your.Funky.Cold.Medina.Namespace.Is 
{ 
    public class DateTimeRouteConstraint : IRouteConstraint 
    { 
     #region IRouteConstraint Members 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, 
          RouteDirection routeDirection) 
     { 
      DateTime dateTime; 

      return DateTime.TryParse(values[parameterName] as string, out dateTime); 
     } 

     #endregion 
    } 
} 

đơn giản: P

+0

Vâng đó là một giải pháp khá thanh lịch. +1 – jrista

+1

Đó là Funky Cold Medina, con trai. –

+0

Nó vẫn còn sai, haha ​​- Tôi đã cố gắng thay đổi "Funcky" thành "Funky" nhưng nó từ chối bản chỉnh sửa là <6 ký tự: '- ( – theyetiman

0

tất cả các khuôn khổ này là overide-thể vì vậy nó có thể, với rất nhiều đau đớn, để overide hành vi mặc định của động cơ tuyến đường nhưng tôi đồng ý với @jrista trong đó bạn có thể muốn làm cho nó một tham số của bộ điều khiển khác mvc sẽ mong đợi để tìm/tìm/bài viết trong thư mục 2010-01-20

+0

trong thư mục 2010-01-20? không có thư mục nào. nó chỉ là bộ điều khiển và quan điểm của họ. Ngoài ra, nó không phải là một phần của phương pháp hành động. Tôi đang thực sự nắm bắt điều này trong bộ điều khiển trừu tượng - bởi vì tất cả các tuyến đường sẽ có điều này. Bằng cách đó, đó là KISS. –

+0

Hmmm, sau đó bạn có thể muốn tải xuống mã nguồn cho khung và xem liệu bạn có thể mở rộng nó hay tìm hiểu cách vượt qua hành vi định tuyến mặc định. – griegs

+0

Tôi đã thực hiện một ràng buộc tuyến đường tùy chỉnh. đã cho tôi một vài phút để làm. giải quyết. –

2

Bạn cũng có thể thiết lập một hạn chế trên các tuyến đường, một cái gì đó như vậy. Cụm từ thông dụng được sử dụng không phải là rất mạnh mẽ, vì vậy bạn nên tinh chỉnh nó.

routes.MapRoute( 
    "Version", " 
    {versionDate}/{controller}/{action}", 
    new {controller="Search", action="Posts"}, 
    new {versionDate= @"\d\d\d\d-\d\d-\d\d" } 
    ); 

Thông tin từ here.

+0

regex, initally, nhưng như bạn đề nghị, nó không phải là rất mạnh mẽ.đó là lý do tại sao tôi muốn sử dụng sức mạnh để 'DateTime.TryParse (...)'. –

+3

@ 37Start: bạn không nghĩ rằng một biểu thức chính quy như '" \ d {4} - \ d {2} - \ d {2} "' sẽ dễ đọc hơn và chuẩn hơn?;) Hoặc thậm chí có thể viết một cái mà chỉ cho phép vào đúng ngày (tháng không lớn hơn 12 vv ..) –

+0

+1 Tuyệt đối sẽ tốt hơn. Tôi luôn luôn phải phá vỡ cuốn sách RegEx khi tôi nhận được xung quanh để viết này như tôi làm điều đó không thường xuyên. Tôi đã viết câu trả lời đó khi tôi đang ra ngoài cửa, vì thế lời bình luận "bạn nên tinh chỉnh nó". – 37Stars

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