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
하위 클래스로 분류할 수 있습니다.