Ignia.Topics.Web.Mvc
El ensamblado Ignia.Topics.Web.Mvc
proporciona una implementación de OnTopic para usar con ASP.NET MVC 5.x Framework.
Hay tres componentes clave en el corazón de la implementación de MVC.
MvcTopicRoutingService
: esta es una implementación concreta de ITopicRoutingService
que acepta información contextual sobre una solicitud determinada (en este caso, la URL y los datos de enrutamiento) y luego la usa para recuperar el Topic
actual de un ITopicRepository
.TopicController
: esta es una instancia de controlador predeterminada que se puede usar para cualquier ruta de tema. Validará automáticamente que el Topic
existe, que no está deshabilitado ( IsDisabled
) y respetará cualquier redireccionamiento (por ejemplo, si el atributo Url
está completo). De lo contrario, devolverá TopicViewResult
según un modelo de vista, nombre de vista y tipo de contenido.TopicViewEngine
: se llama a TopicViewEngine
cada vez que se solicita una vista. Funciona junto con TopicViewResult
para identificar vistas MVC coincidentes en función de ubicaciones y convenciones predeterminadas. Estos se analizan a continuación. Hay seis controladores principales que se incluyen con la implementación de MVC. Además del TopicController
principal, estos incluyen los siguientes controladores auxiliares:
ErrorControllerBase<T>
: proporciona soporte para acciones Error
, NotFound
e InternalServer
. Puede aceptar cualquier IPageTopicViewModel
como argumento genérico; que se utilizará como modelo de vista.FallbackController
: Se utiliza en una fábrica de controladores como respaldo, en caso de que ningún otro controlador pueda aceptar la solicitud. Simplemente devuelve un NotFoundResult
con un mensaje predefinido.LayoutControllerBase<T>
: proporciona soporte para un menú de navegación al asignar automáticamente los tres niveles superiores del espacio de nombres actual (por ejemplo, Web
, sus hijos y nietos). Puede aceptar cualquier INavigationTopicViewModel
como argumento genérico; que se utilizará como modelo de vista para cada instancia asignada.RedirectController
: proporciona una única acción Redirect
que se puede vincular a una ruta como /Topic/{ID}/
; esto proporciona soporte para URL permanentes que son independientes de GetWebPath()
.SitemapController
: proporciona una única acción Sitemap
que devuelve una referencia a ITopicRepository
, lo que permite que una vista del mapa del sitio se recurra a todo el gráfico del tema, incluidos todos los atributos.Nota: No existe una forma práctica para que MVC proporcione enrutamiento para controladores genéricos. Como tales, estos deben ser subclasificados por cada implementación. El controlador derivado no necesita hacer nada más que proporcionar una referencia de tipo específica a la base genérica.
De forma predeterminada, OnTopic coincide con las vistas según el ContentType
del tema actual y, si está disponible, View
.
Hay varias formas de configurar una vista. TopicViewResult
evaluará automáticamente las vistas en función de las siguientes ubicaciones. Se selecciona el primero que coincida con un nombre de vista válido.
?View=
parámetro de cadena de consulta (por ejemplo, ?View=Accordion
)Accept
encabezados (por ejemplo, Accept=application/json
); Tratará el segmento después de /
como un posible nombre de vista.View
atributo (es decir, topic.View
)ContentType
(es decir, topic.ContentType
) Para cada una de las reglas de coincidencia de vistas anteriores, TopicViewEngine
buscará una vista coincidente en las siguientes ubicaciones:
~/Views/{ContentType}/{View}.cshtml
~/Views/ContentTypes/{ContentType}.{View}.cshtml
~/Views/ContentTypes/{ContentType}.cshtml
~/Views/Shared/{View}.cshtml
Nota: Después de buscar en cada una de estas ubicaciones para cada una de las reglas de coincidencia de vistas, el control se entregará a
RazorViewEngine
, que buscará las ubicaciones predeterminadas listas para usar para ASP.NET MVC.
Si topic.ContentType
es ContentList
y el encabezado Accept
es application/json
, TopicViewResult
y TopicViewEngine
se coordinarían para buscar las siguientes rutas:
~/Views/ContentList/JSON.cshtml
~/Views/ContentTypes/ContentList.JSON.cshtml
~/Views/ContentTypes/JSON.cshtml
~/Views/Shared/JSON.cshtml
Si no se encuentra ninguna coincidencia, se buscará el siguiente encabezado Accept
. Finalmente, si no se puede encontrar ninguna coincidencia en las distintas reglas de Ver coincidencia, se buscará lo siguiente:
~/Views/ContentList/ContentList.cshtml
~/Views/ContentTypes/ContentList.ContentList.cshtml
~/Views/ContentTypes/ContentList.cshtml
~/Views/Shared/ContentList.cshtml
En global.asax.cs
, los siguientes componentes deben registrarse en el controlador de eventos Application_Start
:
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
Nota: El nombre de fábrica del controlador es arbitrario y debe seguir las convenciones apropiadas para el sitio. Ignia normalmente usa
{OrganizationName}ControllerFactory
(por ejemplo,IgniaControllerFactory
), pero OnTopic no necesita saber ni importarle cuál es el nombre; es decir, entre su aplicación y ASP.NET MVC Framework.
Al registrar rutas a través de RouteConfig.RegisterRoutes()
(normalmente a través de la clase RouteConfig
), registre una ruta para cualquier ruta de OnTopic:
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
Nota: Debido a que OnTopic se basa en nombres de ruta comodín, se debe configurar una nueva ruta para cada espacio de nombres raíz (por ejemplo,
/Web
). Si bien es posible configurar OnTopic para evaluar todas las rutas, esto dificulta delegar el control a otros controladores y manejadores, cuando sea necesario.
Como OnTopic depende de la inyección del constructor, la aplicación debe configurarse en una raíz de composición ; en el caso de ASP.NET MVC, eso significa una fábrica de controladores personalizada. La estructura básica de esto podría verse así:
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 obtener una plantilla de referencia completa, incluidos los controladores auxiliares, consulte OrganizationNameControllerFactory.cs
Gist.
Nota: El
TopicController
predeterminado identificará automáticamente el tema actual (según, por ejemplo, la URL), asignará el tema actual a un modelo de vista correspondiente (según las convencionesTopicMappingService
) y luego devolverá una vista correspondiente (según las convenciones de vista). Para la mayoría de las aplicaciones, esto es suficiente. Sin embargo, si se necesitan reglas de mapeo personalizadas o lógica de presentación adicional, los implementadores pueden subclasificarTopicController
.