asp.net mvc - studio - ¿Necesita el motor de vista de afeitar autocompletar para trabajar en una biblioteca de clase?
librerias de visual studio 2017 (5)
Tenemos una arquitectura modular donde tenemos algunos archivos de vistas (cshtml) en un proyecto separado (biblioteca de clases). ¿Cómo podemos obtener el resaltado de sintaxis y autocompletar para trabajar cuando el proyecto no es un proyecto MVC?
Tenga en cuenta que la biblioteca de la clase tiene controladores, vistas, modelos, etc. Simplemente no tiene el archivo web.config, global.asax, etc. que tendría un proyecto de mvc normal.
El intellisense funciona para todo menos para el modelo tan importante:
Con MVC3 RTM, si pasa el mouse sobre el Modelo, ahora puede obtener un mensaje de error mejor:
C: / ... / Index.cshtml: error de tiempo de ejecución de ASP.NET: no hay ningún proveedor de compilación registrado para la extensión ''.cshtml''. Puede registrar uno en la sección <compilation> <buildProviders> en machine.config o web.config. Asegúrese de que tiene un atributo BuildProviderAppliesToAttribute que incluye el valor ''Web'' o ''All''.
Así que agregué esto:
<compilation>
<assemblies>
<add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
<buildProviders>
<add
extension=".cshtml"
type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor"/>
</buildProviders>
</compilation>
Luego, después de agregar el proveedor de compilación, aparece este mensaje de error:
C: / ... / Index.cshtml: Error de tiempo de ejecución de ASP.NET: No se pudo cargar el archivo o ensamblado ''System.Web.WebPages.Razor'' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. (C: / ... / machine.config línea 259)
El webconfig de esta publicación funcionará. Lo he copiado a continuación (para la posteridad):
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
<system.web>
<compilation targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</assemblies>
</compilation>
</system.web>
</configuration>
He seguido la sugerencia de Jammer y estoy documentando lo que creo que es el conjunto mínimo de acciones para obtener un proyecto adecuado para servir como un proyecto de biblioteca de clase ASP.NET MVC4. Esto se hizo en Visual Studio 2012 Update 4, y estaba dirigido a VB.Net. Posteriormente, puedo incluir documentación para hacer algo similar en Visual Studio 2013 si tengo la oportunidad. Estas son las acciones que tomé:
- Cree un nuevo proyecto en blanco MVC4 con un directorio separado para la solución (para que pueda ver claramente que el directorio de
packages
con versiones actualizadas de los archivos de referencia es parte del proyecto). - Agregue un controlador ficticio, vista y modelo para probarlo (lo que implica copiar el archivo DLL de salida y verlo en otra aplicación web después de compilar la biblioteca de clases).
- Eliminar los siguientes archivos del proyecto:
- Toda la carpeta
App_Start
- Toda la carpeta
App_Data
y cualquier otra carpeta vacía (mi historial de Mercurial no lo hizo visible, así que me voy de la memoria). -
Global.asax
-
Global.asax.vb
- El archivo
Web.config
en la raíz y losWeb.Debug.config
dependientesWeb.Debug.config
yWeb.Release.config
. (No elimineWeb.config
de la carpeta Vistas).
- Toda la carpeta
- Elimine las siguientes secciones del archivo
Web.config
en la carpeta Vistas:-
appSettings
-
system.web
-
system.webServer
- También puede eliminar líneas
<add namespace="System.Web.Mvc.Ajax" />
y<add namespace="System.Web.Routing" />
-
- Elimine las siguientes referencias del proyecto (* las referencias destacadas eran referencias específicas de la versión que ingresaron en el directorio de
packages
y tienen laCopy Local
Specific Version
Copy Local
ySpecific Version
establecida enTrue
).-
System.Web.Entity
-
System.Web.ApplicationServices
-
System.ComponentModel.DataAnnotations
-
System.Data.DataSetExtensions
-
System.Web.Extensions
-
System.Web.Extensions.Design
-
System.Xml.Linq
-
System.Web.Abstractions
-
System.Web.Routing
-
System.Configuration
-
System.Web.Services
-
System.EnterpriseServices
-
Microsoft.Web.Infrastructure
(1.0.0.0) * -
Microsoft.Web.Mvc.FixedDisplayModes
(1.0.0) * -
Newtonsoft.Json
(4.5.11) * -
System.Net.Http
(2.0.20710.0) * -
System.Net.Http.Formatting
(4.0.20710.0) * -
System.Net.Http.WebRequest
(2.0.20710.0) * -
System.Web.Helpers
(2.0.20710.0) * -
System.Web.Http
(4.0.20710.0) * -
System.Web.Http.WebHost
(4.0.20710.0) *
-
- Elimine las siguientes Importaciones de todo el proyecto de la configuración del proyecto:
-
System.Xml.Linq
-
System.Collections.Specialized
-
System.Configuration
-
System.Web.Caching
-
System.Web.Mvc.Ajax
-
System.Web.Routing
-
System.Web.SessionState
-
System.Web.Security
-
System.Web.Profile
-
System.Web.UI
-
System.Web.UI.WebControls
-
System.Web.UI.WebControls.WebParts
-
System.Web.UI.HtmlControls
-
- Elimine lo siguiente de
packages.config
:- <id del paquete = "Microsoft.AspNet.Mvc.FixedDisplayModes" version = "1.0.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi.Client" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.AspNet.WebApi.Core" version = "4.0.20710.0" targetFramework = "net40" />
- <id del paquete = "Microsoft.AspNet.WebApi.WebHost" version = "4.0.20710.0" targetFramework = "net40" />
- <package id = "Microsoft.Net.Http" version = "2.0.20710.0" targetFramework = "net40" />
- <id del paquete = "Microsoft.Web.Infrastructure" version = "1.0.0.0" targetFramework = "net40" />
- <package id = "Newtonsoft.Json" version = "4.5.11" targetFramework = "net40" />
- Elimine los siguientes subdirectorios de la carpeta de paquetes:
- Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0
- Microsoft.AspNet.WebApi.4.0.20710.0
- Microsoft.AspNet.WebApi.Client.4.0.20710.0
- Microsoft.AspNet.WebApi.Core.4.0.20710.0
- Microsoft.AspNet.WebApi.WebHost.4.0.20710.0
- Microsoft.Net.Http.2.0.20710.0
- Microsoft.Web.Infraestructura.1.0.0.0
- Newtonsoft.Json.4.5.11
Esto me deja con lo siguiente:
- Un proyecto de biblioteca de clase VB.Net con .NET Framework 4 (aunque tenía la intención de que fuera 4.5, creo que cualquiera de los dos funciona).
- Las siguientes referencias .NET no predeterminadas (las referencias destacadas deben tener
Copy Local
Specific Version
Copy Local
ySpecific Version
establecida enTrue
):- System.Web
- packages / Microsoft.AspNet.Mvc.4.0.20710.0 / lib / net40 / System.Web.Mvc.dll *
- packages / Microsoft.AspNet.Razor.2.0.20715.0 / lib / net40 / System.Web.Razor.dll *
- packages / Microsoft.AspNet.WebPages.2.0.20710.0 / lib / net40 / System.Web.WebPages.dll *
- packages / Microsoft.AspNet.WebPages.2.0.20710.0 / lib / net40 / System.Web.WebPages.Deployment.dll *
- packages / Microsoft.AspNet.WebPages.2.0.20710.0 / lib / net40 / System.Web.WebPages.Razor.dll *
- Las siguientes importaciones no predeterminadas:
- System.Web
- System.Web.Mvc
- System.Web.Mvc.Html
- Los siguientes archivos de proyecto / estructura:
- Carpeta de
Controllers
contieneCustomUIController.vb
- Carpeta de
Models
contieneCustomUIModel.vb
-
Views
carpetaViews
contiene la carpetaCustomUI
, que contieneIndex.vbhtml
- Carpeta de
- Archivo
Web.config
en la carpeta Vistas. Vea a continuación el contenido. - Archivo
packages.config
en la raíz del proyecto. Vea a continuación el contenido.
El contenido de mis archivos es el siguiente:
Web.config
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Html" />
</namespaces>
</pages>
</system.web.webPages.razor>
</configuration>
packages.config
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.20715.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net40" />
</packages>
CustomUIController.vb
Imports System.Web.Mvc
Public Class CustomUIController
Inherits Controller
Public Function Index() As ActionResult
Return View()
End Function
End Class
CustomUIModel.vb
Public Class CustomUIModel
Public Property Name As String
Public Property Value As Decimal
End Class
Index.vbhtml
@ModelType CustomTemplate.CustomUIModel
@Html.LabelFor(Function(m) m.Name)
En este punto, puedo trabajar con Intellisense ayudándome en las vistas .vbhtml y las clases .vb, compilar el proyecto, luego copiar solo las vistas a la carpeta de Views
implementadas de la aplicación principal (en el subdirectorio apropiado), y la DLL de salida primaria del proyecto al directorio bin
implementado de la aplicación principal (los archivos DLL dependientes ya están allí).
Editar:
Después de seguir el proceso en otro sistema para validarlo y cómo funciona para .NET 4.5 y VS 2013, he notado lo siguiente:
- Creo que olvidé mencionar que la referencia a
System.Web.DynamicData
se puede eliminar. - En VS 2013 y / o .NET 4.5, algunas versiones cambian:
- packages / Microsoft.AspNet.Mvc.4.0.30506.0 / lib / net40 / System.Web.Mvc.dll
- packages / Microsoft.AspNet.Razor.2.0.30506.0 / lib / net40 / System.Web.Razor.dll
- packages / Microsoft.AspNet.WebPages.2.0.30506.0 / lib / net40 / System.Web.WebPages.dll
- packages / Microsoft.AspNet.WebPages.2.0.30506.0 / lib / net40 / System.Web.WebPages.Deployment.dll
- packages / Microsoft.AspNet.WebPages.2.0.30506.0 / lib / net40 / System.Web.WebPages.Razor.dll
- No sé si ya lo mencioné suficientemente, pero las referencias a archivos DLL privados (Copy Local) deben establecerse en Copy Local, y / o tienen que usar la versión proporcionada en la carpeta de paquetes cuando creando un proyecto a partir de la plantilla MVC4. No sé por qué, pero las versiones .NET estándar (no privadas) no parecen funcionar, por lo menos en lo que respecta a Intellisense.
- La mejor forma de comprobar si las cosas siguen "OK" en lo que respecta al IDE es cerrar la solución, eliminar las carpetas
bin
yobj
en la salida del proyecto personalizado, volver a cargar la solución, colocar el cursor enLabelFor
en el índice .vbhtml file, y presione la tecla F12 para ver si lo lleva al Object Browser.
Debido a las nuevas versiones, el archivo de paquetes es diferente:
Packages.config
<packages>
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net45" />
</packages>
Muy bien, este es un tiro largo, pero me encontré con el mismo problema. ¿Estás usando JetBrains Resharper?
Resharper anula el motor Intellisense de VS pero no comprende la sintaxis de Razor. Simplemente tiene que decirle a VS que confíe en su propio intellisense en lugar de Resharper.
En VS2010, vaya a Resharper - Opciones - Intellisense - General. Luego, verifica el botón de radio de Visual Studio.
Funcionó muy bien para mí
Ninguna de las soluciones que pude encontrar en línea o en SO me solucionó esto.
Puede parecer un mazo para romper una nuez, pero creé un proyecto de aplicación MVC 4 en lugar de una biblioteca de clase y arranqué todo lo que no necesitaba. Intellisense y @model
funcionan bien.
Para Visual Studio 2012 / ASP.NET MVC 4, debe actualizar las versiones de ensamblaje y agregar <add key="webpages:Version" value="2.0.0.0" />
a appSettings
. Así es como se ve mi Web.config:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Version" value="2.0.0.0" />
</appSettings>
<system.web>
<compilation targetFramework="4.5">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
</system.web>
</configuration>