2011-12-17 4 views
3

문제가 있습니다. MVC 3에는 페이지라는 페이지가 있습니다.영역을 MVC에서로드 할 수 없습니다. 리소스를 찾을 수 없습니다.

방금 ​​Media라는 새 영역을 추가했는데 이제는 해당 영역에 대해 "리소스를 찾을 수 없습니다"라는 메시지가 나타납니다. 나는 그것이 작동하는 PageArea와 정확히 같아 보이므로 미쳐 가고 있습니다. 여기

가 여기에 MediaAreaRegistration.cs

public override string AreaName 
    { 
     get 
     { 
      return "Media"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Media_default", 
      "{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

입니다 내 global.asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 


    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

내가 로컬 호스트/미디어 /를 통해 액세스를 시도하고 있지만, 난 그냥 "리소스를 찾을 수 없습니다"얻고있다.

아이디어가 있으십니까?

+0

경로가 실제로 동일합니까? '/ media' URL이 미디어 영역의 기본 컨트롤러 또는'media' 컨트롤러에 일치해야합니까? – Jan

+0

mediacontroller라는 컨트롤러와 일치해야합니다. 라우트는 동일하며 routename 만 다른 것입니다. –

+0

그래도 어느 지역에 있니? 정확하게 동일한 경로를 사용하는 것은 의미가 없습니다. 마지막에 등록 된 경로는 결코 일치하지 않습니다. 경로 이름은 라우팅에 전혀 영향을주지 않습니다. – Jan

답변

1

일반적으로 영역을 만들면 global.asax와 다른 기본 경로가 생성됩니다. 예를 들어, 나는 MVC3 프로젝트에서 미디어 영역을 생성하고, 기본 경로는 다음과 같습니다 : 그들은에서 컨트롤러를 찾을 것을 제외하고 지역에서

context.MapRoute(
    "Media_default", 
    "Media/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

경로가 정말 글로벌 asax에 정의 된 경로 다르지 않습니다 다른 네임 스페이스. 또한 global.asax의 경로 앞에로드됩니다. Application_Start에서 RegisterRoutes 전에 RegisterAllAreas가 호출되기 때문에이를 볼 수 있습니다. 그래서

base/ControllerAName/Action1Name 
base/ControllerAName/Action2Name 
base/ControllerBName/Action6Name 

... 그리고 :

일반적으로이 URL의 당신의 Global.asax에 정의 된 경로와 루트 컨트롤러에 대한 스키마입니다. 이것은 MVC와 함께 제공되는 "컨벤션"입니다. 자세히 보면, 당신은이 패턴은 글로벌 asax에 기본 경로 정의와 일치하는지 볼 수 있습니다 : 한편

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", 
     id = UrlParameter.Optional } // Parameter defaults 
); 

, 당신이 영역을 사용하는 규칙은 "기존의"URL 스키마는 다음과 같이 것입니다 :

base/AreaName/ControllerAName/Action1Name 
base/AreaName/ControllerAName/Action2Name 
base/AreaName/ControllerBName/Action6Name 

차이점이 있습니까? 이것이 지역 등록의 기본 경로 정의가 다음과 같이 보이는 이유입니다. "Media/{controller}/{action}/{id}"

이 모든 내용을 따르면 대회 관습을 벗어나는 것을 막을 수있는 방법은 없습니다 . Media라는 이름의 영역과이 영역의 일부 컨트롤러에서 동작 방법으로 이동하는 URL 기반/미디어를 갖고 싶은 것 같습니다. 그게 맞다면,이 시도 - MVC에 의해 생성 된 기본 경로 전에보다 구체적인 경로를 넣어 기억 : 이것은 MVC는의를 MediaController의 색인 작업 방법에 대한 기본/미디어와 일치한다는 것을 의미

context.MapRoute(null, 
    "media", 
    new { action = "Index", controller = "Media" } 
); 

context.MapRoute(
    "Media_default", 
    "Media/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 

당신의 미디어 영역, 그 경로가 먼저 정의되기 때문입니다.

또한 새 영역을 만들 때 은 어떤 이름 공간도 변경하지 마십시오.. 이것은 단지 당신에게 문제를 일으킬 것입니다.

다른 팁은 경로에 경로 이름을 지정하지 않는 것입니다. 첫 번째 인수로 null을 어떻게 전달했는지 확인하십시오. 이것은 좋은 연습으로 간주됩니다. 이름으로 경로에 액세스하는 것은 매우 혼란 스러울 수 있습니다.

새 프로젝트를 시작하거나 새 영역을 만들고이 제안을 시도해 보는 것이 좋습니다. 웹 폼에서 오는 경로를 파악하는 것은 까다로울 수 있지만, 일단 핸들을 잡으면 웹 폼의 URL-TO-FILE 매핑보다 우월하다고 생각합니다.

+0

감사! 내가 당신에게 첫 번째 제안을 시도했을 때 컨트롤러가 올바르게로드되었지만 URL이 잘못되었습니다. localhost에서로드 할 컨트롤러가 있습니다. localhost/media를 시도 할 때 해당 리소스를 찾을 수 없습니다. 두 번째 제안을 시도해도/Media가 다음과 같이 나타납니다. The resource is not found. –

+0

감사합니다. 아마도 global.asax 경로 매핑에 문제가 있습니까? MVC에 익숙하지 않습니다. 이전 webform 사람, 죄송합니다 : P –

+0

Mick, 경로를 올바르게 가져 오는 것은 웹 양식에서 까다로울 수 있습니다. 웹 양식에서도 MVC에 왔습니다. 경로의 순서가 중요하다는 것을 기억하십시오. 나는 나의 대답을 업데이트 할 것이다. – danludwig

7

컨트롤러의 네임 스페이스를 확인하십시오. 내 경우에는; 기본 경로이었다 :

context.MapRoute(
      "Admin_default", 
      "Admin/{controller}/{action}/{id}", 
      defaults: new {controller = "Home", action = "Index", AreaName="Admin", id = UrlParameter.Optional }, 
      namespaces: new[] { "MyApp.Admin.Controllers"} 
     ); 

하지만 컨트롤러를 만들 때의 MVC는 자동으로 새 컨트롤러의 네임 스페이스로 "MyApp.WebUI.Areas.Admin.Controllers"로 설정; 네임 스페이스를 기본 경로에서 "MyApp.Admin.Controllers"로 정의하고 응용 프로그램이 잘 작동하도록 네임 스페이스를 변경했습니다.

+0

그것은 나를위한 네임 스페이스였습니다. 일부 컨트롤러를 영역에 붙여 넣고 복사하는 것을 잊었습니다. – biddano

+0

네임 스페이스 팁이 좋습니다. 내 프로젝트를 옮길 때 내 모델의 네임 스페이스가 더 이상 뷰에 지정된대로 일치하지 않도록 네임 스페이스의 이름을 변경했습니다. MVC의 경고 또는 도움없이 아무렇게나 조용한 "리소스를 찾을 수 없습니다"라는 오류 메시지가 표시됩니다. 위대한 팁, 당연히 upvoted. – markaaronky

0

필자의 경우 어떤 사람이 존재하기 전에 RouteConfig.cs에 routes.Clear()을 추가했습니다. 하지만 이제는 영역을 추가했습니다. 이것은 모든 경로를 지우는 것입니다.

관련 문제