2012-10-28 33 views
5

Tôi có một trang web có cấu trúc Tuyến đường "chung" và khu vực "Dịch" bổ sung. Vì vậy, ở cấp cao nhất, bạn có cái gì đó như:Định tuyến MVC ASP.NET - tất cả đều khớp với mẫu tuyến đường chính xác, nhưng không hoạt động

  • /
  • /Về ("chung chung")
  • /Dịch (khu vực)

Trong khu vực Dịch, tôi có:

  • /Dịch/Word (WordController, Index hành động)
  • /Dịch/Word/Thêm (WordControll er, Thêm hành động)
  • /Dịch/Word/Nâng cao (WordController, Cải thiện hành động)

Tất cả những công việc.

Tuy nhiên, ngay sau khi tôi thêm bộ điều khiển thêm vào cấu trúc hiện tại, ví dụ: Định nghĩa ...

  • /Dịch/Definition (DefinitionController, Index hành động)
  • /Dịch/Definition/Thêm (DefinitionController, Thêm hành động)

hoặc phát âm ...

  • /Dịch/Phát âm (PronunciationController, Hành động lập chỉ mục)
  • /Dịch/phát âm/Thêm (PronunciationController, Thêm acti trên)

Tất cả tôi nhận được là một 404.

cấu hình định tuyến khu vực Mỹ là dưới đây:

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Translate_direct", 
      "Translate/{controller}/{action}", 
      new { action = "Index", controller = "Default", } 
     ); 
     context.MapRoute(
      "Translate_default", 
      "Translate/{toLanguageCode}/{query}/{fromLanguageCode}/{controller}/{section}/{action}/{id}", 
      new { action = "Index", controller="Default", id = UrlParameter.Optional, section=UrlParameter.Optional } 
     ); 
    } 

Tôi đã cài đặt Phil Haack's RouteDebugger và đã có kết quả sau:

Screenshot

Vì vậy, nó xuất hiện để phù hợp với Bộ điều khiển và hành động, nhưng tôi chỉ nhận được một 404.

Đối với tính đầy đủ và đảm bảo, "MVC" cấu trúc tập tin của tôi cũng được hiển thị:

enter image description here

tôi là thiếu rõ ràng cái gì đó rõ ràng nhưng không chắc chắn những gì ...?


Cập nhật:

Dường như không gian tên của tôi có liên quan đến bằng cách nào đó.

Lớp TranslateAreaRegistration của tôi có không gian tên Taggloo.Web.Client.Areas.Dịch nhưng PronunciationController của tôi có một không gian tên là * Taggloo.Web. ** Mvc. ** Client.Areas.Translate.Controllers *

Dường như một lỗi trong không gian tên của tôi đã khiến cho hai khác biệt (TranslateAreRegistration lớp học phải ở trong không gian tên Taggloo.Web.Mvc.Client.Areas.Translate). Tôi đã thử làm cho cả hai số này là Taggloo.Web.Mvc .... nhưng điều này không hiệu quả. Tôi đã bắt đầu đặt cả hai thành Taggloo.Web.Client ... thay vào đó và giờ nó hoạt động.

Vì vậy, không phải là một giải pháp, một cách giải quyết, và mặc dù nhìn xung quanh về điều này, tôi vẫn không có khôn ngoan hơn là tại sao.

+2

Xin chào, Tất cả những gì bạn muốn là có cùng một không gian tên trên tất cả các trình điều khiển. Cả hai bộ điều khiển của tôi đều nằm trong các thư mục khác nhau, tức là Nhật ký và Lỗi tương ứng. Tất cả dường như hoạt động với tôi ví dụ: 'đang namespace Web.Controllers { public class LogController: Bộ điều khiển { }} namespace Web.Controllers { public class ErrorController: Bộ điều khiển { }} ' –

+0

Ah, nhờ @NipunAmbastha . Có vẻ như tôi đã bỏ lỡ một trong những Bộ điều khiển của mình. –

+0

Rất vui, tôi có thể giúp bạn :) –

Trả lời

1

Đăng ký khu vực mặc định trong MVC (System.Web.Mcv.AreaRegistration.RegisterAllAreas) sử dụng không gian tên của các lớp bắt nguồn AreaRegistration của khu vực để thêm mã thông báo không gian tên vào định nghĩa tuyến nếu bạn sử dụng một trong các quá tải AreaRegistrationContext.MapRoute .

DefaultControllerFactory sau đó kiểm tra chéo không gian tên của bộ điều khiển khi kết hợp tuyến đường nếu mã thông báo Namespaces được xác định.

Nếu không gian tên của bộ điều khiển giống hệt nhau (hoặc bắt đầu bằng nếu dấu cách không gian tên kết thúc bằng dấu *.) Thì nhà máy sẽ khớp với loại bộ điều khiển và tiến hành khởi tạo bộ điều khiển. Nếu nó không khớp và ControllerFactory trả về null từ phương thức GetControllerType, và cuối cùng bạn sẽ nhận được 404.

Bạn đã đề cập rằng bạn đặt cả Taggloo.Web.Mvc .... Nếu chúng giống hệt nhau, nó đã hoạt động .

+0

Có, tôi đã tìm ra điều này đúng lúc. Cảm ơn. Có rất nhiều đang xảy ra "dưới nắp" trong MVC Tôi đôi khi tự hỏi nếu M là viết tắt của "Magic". Bạn phải * biết * các quy ước (trên cấu hình) và lý do đằng sau. –

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