Ignia.Topics.Web.Mvc
O assembly Ignia.Topics.Web.Mvc
fornece uma implementação de OnTopic para uso com o ASP.NET MVC 5.x Framework.
Existem três componentes principais no centro da implementação do MVC.
MvcTopicRoutingService
: Esta é uma implementação concreta do ITopicRoutingService
que aceita informações contextuais sobre uma determinada solicitação (neste caso, a URL e os dados de roteamento) e então as utiliza para recuperar o Topic
atual de um ITopicRepository
.TopicController
: Esta é uma instância de controlador padrão que pode ser usada para qualquer caminho de tópico. Ele validará automaticamente que o Topic
existe, que não está desabilitado ( IsDisabled
) e honrará quaisquer redirecionamentos (por exemplo, se o atributo Url
estiver preenchido). Caso contrário, ele retornará TopicViewResult
com base em um modelo de visualização, nome de visualização e tipo de conteúdo.TopicViewEngine
: O TopicViewEngine
é chamado toda vez que uma visualização é solicitada. Ele funciona em conjunto com TopicViewResult
para identificar visualizações MVC correspondentes com base em locais e convenções predeterminados. Eles são discutidos abaixo. Existem seis controladores principais fornecidos com a implementação MVC. Além do TopicController
principal, eles incluem os seguintes controladores auxiliares:
ErrorControllerBase<T>
: fornece suporte para ações Error
, NotFound
e InternalServer
. Pode aceitar qualquer IPageTopicViewModel
como argumento genérico; que será usado como modelo de visualização.FallbackController
: Usado em uma fábrica de controladores como substituto, caso nenhum outro controlador possa aceitar a solicitação. Simplesmente retorna um NotFoundResult
com uma mensagem predefinida.LayoutControllerBase<T>
: Fornece suporte para um menu de navegação mapeando automaticamente as três camadas superiores do namespace atual (por exemplo, Web
, seus filhos e netos). Pode aceitar qualquer INavigationTopicViewModel
como argumento genérico; que será usado como modelo de visualização para cada instância mapeada.RedirectController
: Fornece uma única ação Redirect
que pode ser vinculada a uma rota como /Topic/{ID}/
; isso fornece suporte para URLs permanentes que são independentes de GetWebPath()
.SitemapController
: Fornece uma única ação Sitemap
que retorna uma referência ao ITopicRepository
, permitindo assim que uma visualização do mapa do site seja recorrente em todo o gráfico do tópico, incluindo todos os atributos.Nota: Não existe uma maneira prática para o MVC fornecer roteamento para controladores genéricos. Como tal, estes devem ser subclassificados por cada implementação. O controlador derivado não precisa fazer nada além de fornecer uma referência de tipo específico para a base genérica.
Por padrão, OnTopic corresponde às visualizações com base no ContentType
do tópico atual e, se disponível, View
.
Existem várias maneiras de definir uma visualização. O TopicViewResult
avaliará automaticamente as visualizações com base nos seguintes locais. O primeiro que corresponder a um nome de visualização válido será selecionado.
?View=
parâmetro de string de consulta (por exemplo, ?View=Accordion
)Accept
cabeçalhos (por exemplo, Accept=application/json
); tratará o segmento após /
como um possível nome de visualizaçãoView
(ou seja, topic.View
)ContentType
(ou seja, topic.ContentType
) Para cada uma das regras de correspondência de visualização acima, o TopicViewEngine
pesquisará nos seguintes locais uma visualização correspondente:
~/Views/{ContentType}/{View}.cshtml
~/Views/ContentTypes/{ContentType}.{View}.cshtml
~/Views/ContentTypes/{ContentType}.cshtml
~/Views/Shared/{View}.cshtml
Observação: depois de pesquisar cada um desses locais para cada uma das regras de Correspondência de Visualização, o controle será entregue ao
RazorViewEngine
, que pesquisará os locais padrão prontos para uso do ASP.NET MVC.
Se topic.ContentType
for ContentList
e o cabeçalho Accept
for application/json
, TopicViewResult
e TopicViewEngine
se coordenarão para pesquisar os seguintes caminhos:
~/Views/ContentList/JSON.cshtml
~/Views/ContentTypes/ContentList.JSON.cshtml
~/Views/ContentTypes/JSON.cshtml
~/Views/Shared/JSON.cshtml
Se nenhuma correspondência for encontrada, o próximo cabeçalho Accept
será pesquisado. Eventualmente, se nenhuma correspondência for encontrada nas diversas regras de correspondência de visualização, o seguinte será pesquisado:
~/Views/ContentList/ContentList.cshtml
~/Views/ContentTypes/ContentList.ContentList.cshtml
~/Views/ContentTypes/ContentList.cshtml
~/Views/Shared/ContentList.cshtml
No global.asax.cs
, os seguintes componentes devem ser registrados no manipulador de eventos Application_Start
:
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
Nota: O nome de fábrica do controlador é arbitrário e deve seguir as convenções apropriadas para o site. Ignia normalmente usa
{OrganizationName}ControllerFactory
(por exemplo,IgniaControllerFactory
), mas OnTopic não precisa saber ou se importar com qual é o nome; isso fica entre seu aplicativo e o ASP.NET MVC Framework.
Ao registrar rotas via RouteConfig.RegisterRoutes()
(normalmente por meio da classe RouteConfig
), registre uma rota para qualquer rota OnTopic:
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
Nota: Como o OnTopic depende de nomes de caminho curinga, uma nova rota deve ser configurada para cada namespace raiz (por exemplo,
/Web
). Embora seja possível configurar o OnTopic para avaliar todos os caminhos, isso torna difícil delegar o controle a outros controladores e manipuladores, quando necessário.
Como o OnTopic depende de injeção de construtor, a aplicação deve ser configurada em uma raiz de composição — no caso do ASP.NET MVC, isso significa uma fábrica de controladores customizada. A estrutura básica disso pode ser semelhante a:
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);
}
Para obter um modelo de referência completo, incluindo os controladores auxiliares, consulte OrganizationNameControllerFactory.cs
Gist.
Nota: O
TopicController
padrão identificará automaticamente o tópico atual (com base, por exemplo, na URL), mapeará o tópico atual para um modelo de visualização correspondente (com base nas convençõesTopicMappingService
) e, em seguida, retornará uma visualização correspondente (com base nas convenções de visualização). Para a maioria das aplicações, isso é suficiente. No entanto, se regras de mapeamento personalizadas ou lógica de apresentação adicional forem necessárias, os implementadores poderão subclassificarTopicController
.