2017-10-12 3 views
1

어플 리케이션이 복잡 해지는 것을 막기 위해 작업을 시작했습니다.
http://localhost:49358/Document/Document/
대신 :하지만 지금은 항상 전화를해야
http://localhost:49358/Document/
어떻게이 지역의 이름으로 컨트롤러에 액세스 할 수 내 경로를 변경할 수 있습니까? (더 HomeController 없음)영역 및 컨트롤러 이름 (asp.net 코어)을 사용한 라우팅

나는 내 프로젝트의 내부에 다음과 같은 폴더 구조를 가지고 :

Folderstructure inside my Project
지역 내 경로에 대한 코드는 다음과 같습니다

routes.MapRoute(name: "areaRoute",template: "{area:exists}/{controller=Home}/{action=Index}"); 

그리고 나는 배치 [Area ("Document")] 내 DocumentController의 태그.

편집 : 나는 HomeControllers 함께 갔다 Shyju 제이미 테일러에 의해 제안
. (빠른 답변과 설명을 주셔서 모두 감사)

내 구조는 이제 다음과 같습니다 및 라우팅이 같은 노력 예상 : 나를 위해
enter image description here

는 여전히 많은 HomeControllers 및 색인을 가지고 dissapointing 약간의 파일. 코드를 탐색하는 것은 더 이상 그렇게 쉬운 일이 아니다 :
enter image description here

Edit2가 :
모든 Homecontrollers 너무 화가 난 후에, 나는 제이미 테일러가 제시 한 솔루션으로 가서 특징 폴더에있는 모든 rearanged. 그것은 약간 더 많은 설정이 필요하지만 제 의견으로는 훨씬 깨끗합니다.
또한 더이 Microsoft 문서에 설명되어 있습니다 (다만 지역의 물건을 생략) :
https://msdn.microsoft.com/en-us/magazine/mt763233.aspx

내 구조는 이제 다음과 같습니다 및 라우팅 마법처럼 작동하고 컨트롤러 이름은 여전히 ​​의미가있다 :
enter image description here

+0

나는 그게 무슨 분야인지 잘 모르겠습니다. 아마도 아키텍처를 재고해야합니다. 아마도 색인 페이지처럼 작동하고 문서 색인보기의 모든 기능을 제공하는 문서 영역 아래에 면도 페이지를 추가 할 수 있습니다. –

+0

"영역은 관련된 기능을 그룹에 별도의 네임 스페이스로 구성하는 데 사용되는 ASP.NET MVC 기능입니다 (라우팅 용) 및 폴더 구조 (보기 용) "는 나에게 약속했다. 그렇지 않으면 무엇을 권하고 싶습니까? – Yush0

+0

편집이 완료되기 직전에 도착했습니다 : P –

답변

1

확실하지 않은 부분이 있습니다. 아마도 아키텍처를 재고해야합니다.

ASP.NET MVC Core application template에 필자는 기능 폴더를 활용했는데 이는 영역과 비슷합니다.

serviceCollection.Configure<RazorViewEngineOptions>(options => 
{ 
    options.ViewLocationExpanders.Add(new FeatureLocationExpander()); 
}); 

FeatureLocationExpander은 다음과 같습니다 : 반환하는 새 문자열 []의 내용을 교체

public class FeatureLocationExpander : IViewLocationExpander 
{ 
    public void PopulateValues(ViewLocationExpanderContext context) 
    { 
    // Don't need anything here, but required by the interface 
    } 

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) 
    { 
    // The old locations are /Views/{1}/{0}.cshtml and /Views/Shared/{0}.cshtml 
    // where {1} is the controller and {0} is the name of the View 

    // Replace /Views with /Features 
    return new string[] 
    { 
     "/Api/{1}/{0}.cshtml", 
     "/Features/{1}/{0}.cshtml", 
     "/Features/Shared/{0}.cshtml" 
    }; 
    } 
} 

이렇게하려면, 나는하여 ConfigureServices 방법에 다음을 추가했습니다 해당 지역의 ExpandViewLocations은 라우팅 속성을 추가 할 필요가 없다는 것을 의미합니다.

하지만 문제가 해결되지 않아 문제가 해결되지 않습니다.

문서 영역의 색인 페이지 역할을하는 Documents 영역 아래에 면도기 페이지 (Index.cshtml)를 추가하지 않는 한. 이 Index.cshtml은 /Documents/Documents/Index.cshtml에있는 Index.cshtml의 모든 기능에 컨트롤러처럼 작동하는 코드 숨김 파일 (ASP.NET 웹 폼 기억)이 추가 된 보너스를 제공 할 수 있습니다 .

+0

나에게 약간의 손길을 뻗 쳤지 만 이것이 내가 찾고 깨끗한 길을 찾고있다. 귀하의 예와이 기사는 내가 그것을 얻을 수 있도록 도와주었습니다 : https://msdn.microsoft.com/en-us/magazine/mt763233.aspx – Yush0

+0

내가 도울 수있어서 기쁩니다. –

2

영역의 기본 경로 등록은 URL의 컨트롤러 기본값으로 HomeController을 사용합니다. DocumentController를 기본값으로 사용하려면 StatrtUp 클래스에서 업데이트하십시오.

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "areas", 
     template: "{area:exists}/{controller=Document}/{action=Index}/{id?}" 
    ); 
}); 

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 

}); 

은 등록 코드가 있음을 유의하십시오 모든에 대한 기존의 지역, (우리는 URL 템플릿에서 {area:exists}을 가지고 있기 때문에)뿐만 아니라 문서 영역. 즉, 요청이 yourApp\someAreaName과 같이 오면 프레임 워크는 DocumentController의 색인 작업 ( someAreaName)에 요청을 보냅니다.

이미 문서와 관련된 코드를 문서 영역에 구성했습니다. 이제 컨트롤러 이름이 문서로 필요한 이유는 무엇입니까? 나는 그것이 반복적이라고 느낀다.

개인적으로 문서 영역 내의 DocumentController의 이름을 HomeController으로 바꾸고 URL 등록에서 기본 컨트롤러 값으로 HomeController를 사용하는 영역 등록에 대한 기본 경로 등록 코드를 사용합니다. 이렇게하면 미래 영역에서 효과가 나타나고 코드는 더 깨끗 해집니다. IMHO, 모든 영역의 HomeController는 어떤 영역의 DocumentController가 혼란 스러울 때 유용합니다.

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "areas", 
     template: "{area:exists}/{controller=Home}/{action=Index}/{id?}" 
    ); 
}); 
+0

답변 해 주셔서 대단히 감사합니다. 나는이 접근법을 우연히 발견했다. 그러나 이것은 모든 새로운 "모듈"에 대해 startup.cs에 새로운 항목이 있음을 의미합니다. 나는 같은 것을 달성하려고합니다 : {area : exists}/{controller = }/{action = Index}/{id?} – Yush0

+0

예. 그래서 나는 문서에서 집으로 컨트롤러의 이름을 바꾸는 것이 좋습니다. (이미 문서 영역에 코드를 구성 했으므로 컨트롤러의 이름이 반복되는 이유는 무엇입니까?) 그리고 작성한 모든 새로운 영역에서 작동 할 기본 (일반) 등록 코드를 사용하십시오. 앞으로는. – Shyju

관련 문제