2011-10-24 36 views
6

Tôi có URL như:Làm thế nào để xử lý định tuyến này?

  • /en/blog (cho thấy cái nhìn tổng quan hay blog entries)
  • /en/blog/trả-lớn-nấu-and-là-fair-khen thưởng (cho thấy mục blog với urltitle)
  • /en/blog/tại sao-thay-hơn-chuyên gia dinh dưỡng-bếp (cho thấy mục blog với urltitle)

cho các tuyến đường bao nhiêu người theo tôi đã xác định

  • A: tuyến đường "en/blog/{bài viết trang}" với chế trang bài viết = @ "\ d"
  • B: đường "en/blog"
  • C: Route "en/blog/{urltitle}/{page bình luận } "với trang bình luận chế = @" \ d "
  • d: đường" en/blog/{urltitle} "

Câu hỏi 1: này hoạt động tốt, nhưng có lẽ đó là một giải pháp tốt hơn với ca khúc ít?

Câu hỏi 2: để thêm một bài viết mới, tôi có một AddArticle phương pháp hành động trong điều khiển Blog. Tất nhiên, với các tuyến đường quy định trên, URL "/ en/blog/addarticle" sẽ lập bản đồ để định tuyến D, nơi addarticle sẽ là urltitle-đó là không đúng tất nhiên. Vì vậy tôi đã thêm các tuyến đường sau:

  • E: đường "com/blog/_ {action}"

và vì vậy bây giờ các url "/ _addarticle/en/blog" thư mục để tuyến đường này, và thực hiện phương thức hành động chính xác. Nhưng tôi đã tự hỏi liệu có cách nào tốt hơn để xử lý điều này?

Cám ơn những lời khuyên.

+1

Câu hỏi hay. Tôi thực sự quan tâm đến bất kỳ câu trả lời nào. – Phil

+0

Có thể hạn chế tuyến đường tùy chỉnh có thể là giải pháp thanh lịch nhất? –

+0

ok, cho câu hỏi 2 Tôi tự tìm ra câu trả lời. Tôi đã tạo một ràng buộc tùy chỉnh được gọi là ExcludeConstraint và thay đổi tuyến D là: route "nl/blog/{urltitle}" với ràng buộc "new {urltitle = new ExcludeConstraint (new List () {" addarticle "," addcomment "," gettags "})}));". Bây giờ, url của tôi vẫn sạch sẽ, như/nl/blog/addcomment –

Trả lời

4

Câu trả lời cho câu hỏi của riêng tôi:

Đối với câu hỏi một, tôi tạo ra một hạn chế tùy chỉnh IsOptionalOrMatchesRegEx:

public class IsOptionalOrMatchesRegEx : IRouteConstraint 
{ 
    private readonly string _regEx; 

    public IsOptionalOrMatchesRegEx(string regEx) 
    { 
     _regEx = regEx; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var valueToCompare = values[parameterName].ToString(); 
     if (string.IsNullOrEmpty(valueToCompare)) return true; 
     return Regex.IsMatch(valueToCompare, _regEx); 
    } 
} 

Sau đó, các điểm A và B có thể được biểu hiện quá mức trong một tuyến đường:

  • url: "com/blog/bài viết {page}"
  • giá trị mặc định: mới trang bài viết = {UrlParameter.Optional}
  • chế: mới {articlepage = new IsOptionalOrMatchesRegEx (@ "\ d")

Đối với câu hỏi 2, tôi đã tạo ra một ExcludeConstraint:

public class ExcludeConstraint : IRouteConstraint 
{ 
    private readonly List<string> _excludedList; 

    public ExcludeConstraint(List<string> excludedList) 
    { 
     _excludedList = excludedList; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var valueToCompare = (string)values[parameterName]; 
     return !_excludedList.Contains(valueToCompare);    
    } 
} 

Route D sau đó có thể được thay đổi như sau:

  • url: "nl/blog/{urltitle}"
  • chế: mới {urltitle = new ExcludeConstraint (Danh sách mới() { "một ddarticle "," addcomment "," gettags "})}));
Các vấn đề liên quan