route net mvc attribute asp addcontrollersasservices asp.net-mvc-3 asp.net-mvc-areas

asp.net-mvc-3 - mvc - modelbinder asp net core



ASP.NET MVC3-Áreas en ensamblajes separados (4)

1 - Separe sus áreas de Mvc en diferentes proyectos de Mvc para compilarlos en sus propios ensamblajes separados

2: agregue esto a su clase AssemblyInfo.cs para llamar a un método cuando se carga la aplicación

[assembly: PreApplicationStartMethod(typeof(PluginAreaBootstrapper), "Init")]

3 - Así es como se ve el método Init cuando se invoca durante la carga

public class PluginAreaBootstrapper { public static readonly List<Assembly> PluginAssemblies = new List<Assembly>(); public static List<string> PluginNames() { return PluginAssemblies.Select( pluginAssembly => pluginAssembly.GetName().Name) .ToList(); } public static void Init() { var fullPluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Areas"); foreach (var file in Directory.EnumerateFiles(fullPluginPath, "*Plugin*.dll")) PluginAssemblies.Add(Assembly.LoadFile(file)); PluginAssemblies.ForEach(BuildManager.AddReferencedAssembly); } }

4 - Agregar un RazorViewEngine personalizado

public class PluginRazorViewEngine : RazorViewEngine { public PluginRazorViewEngine() { AreaMasterLocationFormats = new[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" }; AreaPartialViewLocationFormats = new[] { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" }; var areaViewAndPartialViewLocationFormats = new List<string> { "~/Areas/{2}/Views/{1}/{0}.cshtml", "~/Areas/{2}/Views/{1}/{0}.vbhtml", "~/Areas/{2}/Views/Shared/{0}.cshtml", "~/Areas/{2}/Views/Shared/{0}.vbhtml" }; var partialViewLocationFormats = new List<string> { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" }; var masterLocationFormats = new List<string> { "~/Views/{1}/{0}.cshtml", "~/Views/{1}/{0}.vbhtml", "~/Views/Shared/{0}.cshtml", "~/Views/Shared/{0}.vbhtml" }; foreach (var plugin in PluginAreaBootstrapper.PluginNames()) { masterLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); masterLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); masterLocationFormats.Add( "~/Areas/" + plugin + "/Views/Shared/{1}/{0}.cshtml"); masterLocationFormats.Add( "~/Areas/" + plugin + "/Views/Shared/{1}/{0}.vbhtml"); partialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); partialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); partialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/Shared/{0}.cshtml"); partialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/Shared/{0}.vbhtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Areas/{2}/Views/{1}/{0}.cshtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Areas/{2}/Views/{1}/{0}.vbhtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Areas/{2}/Views/Shared/{0}.cshtml"); areaViewAndPartialViewLocationFormats.Add( "~/Areas/" + plugin + "/Areas/{2}/Views/Shared/{0}.vbhtml"); } ViewLocationFormats = partialViewLocationFormats.ToArray(); MasterLocationFormats = masterLocationFormats.ToArray(); PartialViewLocationFormats = partialViewLocationFormats.ToArray(); AreaPartialViewLocationFormats = areaViewAndPartialViewLocationFormats.ToArray(); AreaViewLocationFormats = areaViewAndPartialViewLocationFormats.ToArray(); } }

5 - Registre sus Áreas de sus diferentes Proyectos Mvc (Área)

namespace MvcApplication8.Web.MyPlugin1 { public class MyPlugin1AreaRegistration : AreaRegistration { public override string AreaName { get { return "MyPlugin1"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "MyPlugin1_default", "MyPlugin1/{controller}/{action}/{id}", new {action = "Index", id = UrlParameter.Optional} ); } } }

El código fuente y las referencias adicionales se pueden encontrar aquí: http://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/

Estoy tratando de configurar una solución MVC3 usando áreas, pero quiero tener mis áreas en diferentes ensamblajes. Por ejemplo, quiero un ensamblaje principal que contenga recursos compartidos como páginas maestras, hojas de estilo, scripts, página de inicio de sesión, etc. Pero quiero distintas áreas de funcionalidad empresarial en ensamblajes separados.

Probé este ejemplo que se escribió para la vista previa de MVC2: http://msdn.microsoft.com/en-us/library/ee307987%28VS.100%29.aspx . (Nota, originalmente lo encontré en este hilo de desbordamiento de pila: ASP.NET MVC - separando la aplicación grande ). Pero parece que MVC3 no tiene la opción de mover los archivos de vista al proyecto principal. No estoy loco por usar la opción de recurso / VirtualPathProvider incrustado.

¿Alguna sugerencia sobre cómo hacer que esto funcione con MVC3?

Gracias, Skip


Consulte este artículo para saber cómo crear un proyecto que funcione como un Área dentro de otra aplicación MVC. Básicamente, los archivos en el proyecto del área viven bajo la carpeta Area en el proyecto principal, pero no se incluyen como parte del proyecto principal (no se hace referencia en el archivo del proyecto).


Puede separar sus controladores y vistas sin el uso de áreas. Para los controladores, puede utilizar Windsor o cualquier otro contenedor IoC para resolver los controladores de diferentes ensamblajes. Por ejemplo, puede registrar todos sus controladores de esta manera:

container.Register(AllTypes.FromAssemblyInDirectory(new AssemblyFilter(HttpRuntime.BinDirectory)).BasedOn<IController>().Configure(c => c.LifeStyle.Transient));

También tienes que implementar IDependencyResolver y luego configurar DependencyResolver.SetResolver (...).

Para las vistas tienes dos opciones:

  1. Recursos incrustados y VirtualPathProvider
  2. Simplemente copie los archivos de vista en la ubicación adecuada después de compilar / implementar

Construimos un marco simple (similar a las áreas portátiles) utilizando Windsor y las vistas de recursos integrados proporcionadas por una implementación VirutalPathProvider.


Puede usar MvcContrib con áreas portátiles , pero de esta manera tendría vistas integradas.

Solo crea un MVC y un proyecto de biblioteca de clases. Cree su área en el proyecto MVC y después de que termine, mueva todo, excepto las Vistas del área a la biblioteca de clases.

Use NuGet para obtener este paquete y listo, puede usar su nueva área de NuGet en cada proyecto de MVC.