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}.cshtmlObservaçã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
TopicControllerpadrã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.