Ignia.Topics.Web.Mvc Ignia.Topics.Web.Mvc 어셈블리는 ASP.NET MVC 5.x Framework와 함께 사용할 OnTopic 구현을 제공합니다.
MVC 구현의 핵심에는 세 가지 주요 구성 요소가 있습니다.
MvcTopicRoutingService : 이는 지정된 요청(이 경우 URL 및 라우팅 데이터)에 대한 컨텍스트 정보를 승인한 다음 이를 사용하여 ITopicRepository 에서 현재 Topic 검색하는 ITopicRoutingService 의 구체적인 구현입니다.TopicController : 모든 토픽 경로에 사용할 수 있는 기본 컨트롤러 인스턴스입니다. Topic 존재하는지, 비활성화되지 않았는지( IsDisabled ) 자동으로 확인하고 모든 리디렉션을 준수합니다(예: Url 속성이 채워진 경우). 그렇지 않으면 뷰 모델, 뷰 이름 및 콘텐츠 유형을 기반으로 TopicViewResult 반환합니다.TopicViewEngine : TopicViewEngine 뷰가 요청될 때마다 호출됩니다. TopicViewResult 와 함께 작동하여 미리 결정된 위치 및 규칙을 기반으로 일치하는 MVC 보기를 식별합니다. 이에 대해서는 아래에서 설명합니다. MVC 구현에는 6개의 기본 컨트롤러가 제공됩니다. 핵심 TopicController 외에도 다음과 같은 보조 컨트롤러가 포함됩니다.
ErrorControllerBase<T> : Error , NotFound 및 InternalServer 작업에 대한 지원을 제공합니다. 모든 IPageTopicViewModel 일반 인수로 받아들일 수 있습니다. 뷰 모델로 사용될 것입니다.FallbackController : 다른 컨트롤러가 요청을 수락할 수 없는 경우 컨트롤러 팩토리에서 폴백으로 사용됩니다. 간단히 사전 정의된 메시지와 함께 NotFoundResult 를 반환합니다.LayoutControllerBase<T> : 현재 네임스페이스의 상위 3개 계층(예: Web , 해당 자식 및 손자)을 자동으로 매핑하여 탐색 메뉴에 대한 지원을 제공합니다. 모든 INavigationTopicViewModel 일반 인수로 받아들일 수 있습니다. 이는 매핑된 각 인스턴스의 뷰 모델로 사용됩니다.RedirectController : /Topic/{ID}/ 와 같은 경로에 바인딩될 수 있는 단일 Redirect 작업을 제공합니다. 이는 GetWebPath() 와 독립적인 영구 URL에 대한 지원을 제공합니다.SitemapController : ITopicRepository 에 대한 참조를 반환하는 단일 Sitemap 작업을 제공하므로 사이트맵 보기가 모든 속성을 포함하여 전체 주제 그래프에 대해 반복될 수 있습니다.참고: MVC가 일반 컨트롤러에 대한 라우팅을 제공하는 실용적인 방법은 없습니다. 따라서 이들은 각 구현별로 하위 클래스로 분류되어야 합니다 . 파생 컨트롤러는 일반 베이스에 대한 특정 유형 참조를 제공하는 것 외에는 어떤 작업도 수행할 필요가 없습니다.
기본적으로 OnTopic은 현재 주제의 ContentType 및 가능한 경우 View 기반으로 보기를 일치시킵니다.
보기를 설정하는 방법에는 여러 가지가 있습니다. TopicViewResult 다음 위치를 기반으로 뷰를 자동으로 평가합니다. 유효한 보기 이름과 일치하는 첫 번째 항목이 선택됩니다.
?View= 쿼리 문자열 매개변수(예: ?View=Accordion )Accept (예: Accept=application/json ) / 뒤의 세그먼트를 가능한 보기 이름으로 처리합니다.View 속성(예: topic.View )ContentType 속성(예: topic.ContentType ) 위의 각 보기 일치 규칙에 대해 TopicViewEngine 일치하는 보기에 대해 다음 위치를 검색합니다.
~/Views/{ContentType}/{View}.cshtml~/Views/ContentTypes/{ContentType}.{View}.cshtml~/Views/ContentTypes/{ContentType}.cshtml~/Views/Shared/{View}.cshtml참고: 각 뷰 일치 규칙에 대해 이러한 각 위치를 검색한 후 ASP.NET MVC에 대한 기본 기본 위치를 검색하는
RazorViewEngine으로 제어권이 넘겨집니다.
topic.ContentType 이 ContentList 이고 Accept 헤더가 application/json 인 경우 TopicViewResult 및 TopicViewEngine 다음 경로를 검색하도록 조정됩니다.
~/Views/ContentList/JSON.cshtml~/Views/ContentTypes/ContentList.JSON.cshtml~/Views/ContentTypes/JSON.cshtml~/Views/Shared/JSON.cshtml 일치하는 항목이 없으면 다음 Accept 헤더가 검색됩니다. 결국 다양한 뷰 일치 규칙에서 일치하는 항목을 찾을 수 없으면 다음이 검색됩니다.
~/Views/ContentList/ContentList.cshtml~/Views/ContentTypes/ContentList.ContentList.cshtml~/Views/ContentTypes/ContentList.cshtml~/Views/Shared/ContentList.cshtml global.asax.cs 에서 다음 구성 요소는 Application_Start 이벤트 처리기 아래에 등록되어야 합니다.
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
참고: 컨트롤러 공장 이름은 임의적이며 사이트에 적합한 규칙을 따라야 합니다. Ignia는 일반적으로
{OrganizationName}ControllerFactory(예:IgniaControllerFactory)를 사용하지만 OnTopic은 이름이 무엇인지 알거나 신경 쓸 필요가 없습니다. 이는 응용 프로그램과 ASP.NET MVC Framework 사이에 있습니다.
RouteConfig.RegisterRoutes() (일반적으로 RouteConfig 클래스를 통해)를 통해 경로를 등록할 때 모든 OnTopic 경로에 대한 경로를 등록하세요.
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
참고: OnTopic은 와일드카드 경로 이름을 사용하므로 모든 루트 네임스페이스(예:
/Web)에 대해 새 경로를 구성해야 합니다. 모든 경로를 평가하도록 OnTopic을 구성하는 것이 가능하지만 필요한 경우 다른 컨트롤러 및 처리기에 제어를 위임하기가 어렵습니다.
OnTopic은 생성자 주입을 사용하므로 응용 프로그램은 컴포지션 루트 (ASP.NET MVC의 경우 사용자 지정 컨트롤러 팩토리를 의미함)에서 구성되어야 합니다. 이것의 기본 구조는 다음과 같습니다:
var connectionString = ConfigurationManager.ConnectionStrings["OnTopic"].ConnectionString;
var sqlTopicRepository = new SqlTopicRepository(connectionString);
var cachedTopicRepository = new CachedTopicRepository(sqlTopicRepository);
var topicViewModelLookupService = new TopicViewModelLookupService();
var topicMappingService = new TopicMappingService(cachedTopicRepository, topicViewModelLookupService);
var mvcTopicRoutingService = new MvcTopicRoutingService(
cachedTopicRepository,
requestContext.HttpContext.Request.Url,
requestContext.RouteData
);
switch (controllerType.Name) {
case nameof(TopicController):
return new TopicController(sqlTopicRepository, mvcTopicRoutingService, topicMappingService);
case default:
return base.GetControllerInstance(requestContext, controllerType);
}
보조 컨트롤러를 포함한 전체 참조 템플릿은 OrganizationNameControllerFactory.cs Gist를 참조하세요.
참고: 기본
TopicController자동으로 현재 주제를 식별하고(예: URL을 기반으로) 현재 주제를 해당 뷰 모델에 매핑한 다음(TopicMappingService규칙을 기반으로) 해당 뷰를 반환합니다(뷰 규칙을 기반으로). 대부분의 애플리케이션에서는 이것으로 충분합니다. 그러나 사용자 정의 매핑 규칙이나 추가 표현 논리가 필요한 경우 구현자는TopicController하위 클래스로 분류할 수 있습니다.